library(coda)
library(bayesplot) 
library(ggplot2)
library(ggsci)
library(khroma)
library(tidyverse)
library(reshape2)
library(here)
knitr::opts_chunk$set(echo = TRUE, dpi = 300 )

Set up MCSim file

# this markdown file must be saved in top level directory for the following to work; the mcsim code depends on getwd results.
mdir <- "MCSim"
source(here::here(mdir,"setup_MCSim.R"))
# Make mod.exe (used to create mcsim executable from model file)
makemod() 
The mod.exe had been created.

Set filenames and load data

Set up dataset

id_lut <- multicheck$df_check %>% select(Level) %>% unique ()  %>%
  mutate(dataset = c( 
    rep("Decatur M Train", 9),
    rep("Decatur F Train", 9),
    rep("Decatur M Test", 9),
    rep("Decatur F Test", 10),
    rep("Minnesota Train", 49),
    rep("Minnesota Test", 49),
    'Paulsboro-Train','Horsham-Train',
    'Warminster-Test','Warrington-Train'), 
    Sex = c( 
    rep("M", 9),
    rep("F", 9),
    rep("M", 9),
    rep("F", 10),
    rep("Mixed", 49),
    rep("Mixed", 49), 
    rep("Mixed", 4)),
    City = c( 
    rep("Decatur", 18),
    rep("Decatur", 19),
    rep("Minnesota", 98),
    'Paulsboro','Horsham','Warminster','Warrington'), 
    Train_Test = c( 
    rep("Train", 9),
    rep("Train", 9),
    rep("Test", 9),
    rep("Test", 10),
    rep("Train", 49),
    rep("Test", 49),
    'Train','Train',
    'Test','Test'),
        datatype = c(
      rep("Individual",9+9+9+10+49+49),
      rep("Summary",4)),
    Simulation = row_number(),
    variable = paste0(dataset, " ",Simulation))

id_lut$dataset <- factor(id_lut$dataset,levels=
                           c("Decatur M Train","Decatur F Train","Arnsberg M Train",
                             "Arnsberg F Train","Decatur M Test","Decatur F Test","Arnsberg M Test",
                             "Arnsberg F Test","Minnesota Train","Minnesota Test",
                             'Lubeck-Bartell-Train', 'Lubeck-Bartell-Test',
                             'Little Hocking-Bartell-Train', 'Little Hocking-Bartell-Test',
                             'Little Hocking-Emmett-Test','Paulsboro-Train','Horsham-Train',
                             'Warminster-Test','Warrington-Train'))
id_lut$City <- factor(id_lut$City,levels = 
                        c("Decatur","Arnsberg","Minnesota",'Lubeck-Bartell',
                          'Little Hocking-Bartell','Little Hocking-Emmett',
                          'Paulsboro','Horsham','Warminster','Warrington'))
 

indiv_lut <- id_lut %>% 
  filter(City %in% c("Decatur", "Minnesota")) %>%
  mutate(  dataset = as.factor(dataset))

nv <- data.frame(dataset =unique(indiv_lut$dataset), 
           variable= rep("Pop GM", 6),
           type= rep("Pop GM", 6), stringsAsFactors = FALSE)

Scatter plot of predictions (median of multicheck samples) versus data.

This is a Figure 2 panel. Needed to use “scale=1.1” in ggsave to match PFOA.

nrow(multicheck$df_check)
[1] 88000
nrow(id_lut)
[1] 139
multicheck$df_check %>% left_join(id_lut) %>% nrow()
Joining, by = c("Level", "Simulation")
[1] 88000
names(multicheck$df_check)
[1] "Level"      "Simulation" "Output_Var" "Time"       "Data"      
[6] "Prediction"
Level

Simulation

Output_Var

Time

Data

Prediction
multicheck2 <- multicheck$df_check %>% left_join(id_lut)%>% 
  group_by_at ( vars(-Prediction)) %>% 
  summarise(Prediction = median(Prediction)) %>%
  ungroup() %>%
  group_by(City) %>% 
  mutate(Train_Test = factor(Train_Test, levels = c("Train", "Test")),
         `City (datatype)` = factor (paste0(City, "\n(", datatype, ")\n") ),
         label = case_when(Train_Test=="Train" ~ "C: PFOS Train",
                           Train_Test=="Test"  ~"D: PFOS Test",
                           TRUE ~ ""))
Joining, by = c("Level", "Simulation")
Warning in mutate_impl(.data, dots, caller_env()): Unequal factor levels:
coercing to character
Warning in mutate_impl(.data, dots, caller_env()): binding character and factor
vector, coercing into character vector

Warning in mutate_impl(.data, dots, caller_env()): binding character and factor
vector, coercing into character vector

Warning in mutate_impl(.data, dots, caller_env()): binding character and factor
vector, coercing into character vector

Warning in mutate_impl(.data, dots, caller_env()): binding character and factor
vector, coercing into character vector

Warning in mutate_impl(.data, dots, caller_env()): binding character and factor
vector, coercing into character vector

Warning in mutate_impl(.data, dots, caller_env()): binding character and factor
vector, coercing into character vector
 #define color for testing boxplots
bp_cols <- c (as.character (khroma::colour("muted")(9)) , "#191919")   
bp_cols <-bp_cols[c(1,3, 7, 10:8)]# plot_scheme_colourblind(bp_cols) 

### Create aesthetics lookup
aes_lut <- multicheck2 %>% ungroup() %>% 
  group_by(City, datatype,  `City (datatype)` ) %>% summarise () %>% ungroup() %>%
  mutate( cols = bp_cols, city_fills =   bp_cols , 
          # for individual level on point plot (multicheck2), darken outlines for visibility, use standard colors otherwise
         city_outlines =  if_else(datatype == "Individual"  ,  colorspace::darken(city_fills, 0.3), city_fills) ,  
         shapes = case_when(datatype == "Individual"  & `City` %in% c('Decatur', 'Arnsberg', 'Minnesota')   ~  23,
                            datatype == "Summary" &`City` %in% c("Horsham", "Warminster",  "Warrington") ~ 2,
                            datatype == "Summary" & `City` == "Paulsboro" ~ 1,
                            TRUE ~ 18                                ), 
         size = if_else(datatype =="Individual", 1.75, 2.5 ) )  



source( paste0(gsub(basename(here()), 'shared_functions', here()), '/plot_scatter_mcheck.r'))

p2 <- plot_scatter_mcheck(dframe = multicheck2,  pfas_nom = pfas_name, aes_lut_fn = aes_lut )
print(p2) 

ggsave(here ("output-plots", paste0( sa,"multicheckplot_", pfas_name,
               ".pdf")),p2,dpi=600, scale=1.1)
Saving 8.8 x 3.85 in image

Parse multicheck

df_check <- multicheck$df_check
df_check <- subset(df_check,Data > 0) 

n1 <- nrow(df_check)
id_chks <- df_check %>% select(Level) %>% unique() %>% bind_cols(id_lut)  %>%
 mutate(dataset = as.factor(dataset), Sex = as.factor(Sex), City = as.factor(City), 
         Train_Test = as.factor(Train_Test))

df_check <- df_check %>% left_join(id_chks)%>%
  mutate(Dataset = paste(as.character(dataset), Simulation),
         Sex = ordered(Sex, levels = c("M", "F", "Mixed"), 
                       labels = c("Male", "Female", "Mixed (all sexes)")))
Joining, by = c("Level", "Simulation")
n2 <- nrow(df_check)
if(n1 != n2)print("duplicates created in id-lut join")
df_check$Time.desc <- as.character(paste0("T=",df_check$Time))
df_check$Time.desc[df_check$Time.desc == "T=1e-06"] <- "SteadyState"
df_check$Dataset.Time <- interaction(df_check$Dataset,
                                     df_check$Time.desc,lex.order=TRUE)
df_check$Dataset.Time <- factor(df_check$Dataset.Time,
                                levels=levels(df_check$Dataset.Time))
calibdata <- df_check[,names(df_check) != "Prediction"]
calibdata <- calibdata[!duplicated(calibdata),]
print(calibdata)
     Level Simulation Output_Var     Time    Data Level1          dataset
1    1_1_1          1   Cserum_t 0.000000  82.400  1_1_1  Decatur M Train
2    1_1_1          1   Cserum_t 5.802000  70.300  1_1_1  Decatur M Train
3    1_1_2          2   Cserum_t 0.000000  32.600  1_1_2  Decatur M Train
4    1_1_2          2   Cserum_t 5.802000  14.200  1_1_2  Decatur M Train
5    1_1_3          3   Cserum_t 0.000000 236.000  1_1_3  Decatur M Train
6    1_1_3          3   Cserum_t 5.802000  75.400  1_1_3  Decatur M Train
7    1_1_4          4   Cserum_t 0.000000  61.000  1_1_4  Decatur M Train
8    1_1_4          4   Cserum_t 5.802000  12.800  1_1_4  Decatur M Train
9    1_1_5          5   Cserum_t 0.000000 182.000  1_1_5  Decatur M Train
10   1_1_5          5   Cserum_t 5.802000  43.900  1_1_5  Decatur M Train
11   1_1_6          6   Cserum_t 0.000000  25.300  1_1_6  Decatur M Train
12   1_1_6          6   Cserum_t 5.802000  18.800  1_1_6  Decatur M Train
13   1_1_7          7   Cserum_t 0.000000 113.000  1_1_7  Decatur M Train
14   1_1_7          7   Cserum_t 5.802000  24.000  1_1_7  Decatur M Train
15   1_1_8          8   Cserum_t 0.000000  78.200  1_1_8  Decatur M Train
16   1_1_8          8   Cserum_t 5.802000  26.400  1_1_8  Decatur M Train
17   1_1_9          9   Cserum_t 0.000000  54.400  1_1_9  Decatur M Train
18   1_1_9          9   Cserum_t 5.802000  26.500  1_1_9  Decatur M Train
19  1_1_10         10   Cserum_t 0.000000  81.200 1_1_10  Decatur F Train
20  1_1_10         10   Cserum_t 5.802000  31.500 1_1_10  Decatur F Train
21  1_1_11         11   Cserum_t 0.000000  70.700 1_1_11  Decatur F Train
22  1_1_11         11   Cserum_t 5.802000  50.200 1_1_11  Decatur F Train
23  1_1_12         12   Cserum_t 0.000000  13.700 1_1_12  Decatur F Train
24  1_1_12         12   Cserum_t 5.802000  12.800 1_1_12  Decatur F Train
25  1_1_13         13   Cserum_t 0.000000  42.000 1_1_13  Decatur F Train
26  1_1_13         13   Cserum_t 5.802000  28.100 1_1_13  Decatur F Train
27  1_1_14         14   Cserum_t 0.000000  98.000 1_1_14  Decatur F Train
28  1_1_14         14   Cserum_t 5.802000  35.100 1_1_14  Decatur F Train
29  1_1_15         15   Cserum_t 0.000000  56.900 1_1_15  Decatur F Train
30  1_1_15         15   Cserum_t 5.802000  45.900 1_1_15  Decatur F Train
31  1_1_16         16   Cserum_t 0.000000  32.500 1_1_16  Decatur F Train
32  1_1_16         16   Cserum_t 5.802000  13.300 1_1_16  Decatur F Train
33  1_1_17         17   Cserum_t 0.000000  60.500 1_1_17  Decatur F Train
34  1_1_17         17   Cserum_t 5.802000  27.600 1_1_17  Decatur F Train
35  1_1_18         18   Cserum_t 0.000000  43.800 1_1_18  Decatur F Train
36  1_1_18         18   Cserum_t 5.802000  34.700 1_1_18  Decatur F Train
37   1_2_1         19   Cserum_t 0.000000  64.100  1_2_1   Decatur M Test
38   1_2_1         19   Cserum_t 5.802000  15.000  1_2_1   Decatur M Test
39   1_2_2         20   Cserum_t 0.000000  89.600  1_2_2   Decatur M Test
40   1_2_2         20   Cserum_t 5.802000  24.700  1_2_2   Decatur M Test
41   1_2_3         21   Cserum_t 0.000000  74.700  1_2_3   Decatur M Test
42   1_2_3         21   Cserum_t 5.802000  39.800  1_2_3   Decatur M Test
43   1_2_4         22   Cserum_t 0.000000  68.400  1_2_4   Decatur M Test
44   1_2_4         22   Cserum_t 5.802000  30.000  1_2_4   Decatur M Test
45   1_2_5         23   Cserum_t 0.000000  72.900  1_2_5   Decatur M Test
46   1_2_5         23   Cserum_t 5.802000  32.200  1_2_5   Decatur M Test
47   1_2_6         24   Cserum_t 0.000000  78.100  1_2_6   Decatur M Test
48   1_2_6         24   Cserum_t 5.802000  45.400  1_2_6   Decatur M Test
49   1_2_7         25   Cserum_t 0.000000  24.100  1_2_7   Decatur M Test
50   1_2_7         25   Cserum_t 5.802000  15.400  1_2_7   Decatur M Test
51   1_2_8         26   Cserum_t 0.000000  60.900  1_2_8   Decatur M Test
52   1_2_8         26   Cserum_t 5.802000  22.000  1_2_8   Decatur M Test
53   1_2_9         27   Cserum_t 0.000000 137.000  1_2_9   Decatur M Test
54   1_2_9         27   Cserum_t 5.802000  70.700  1_2_9   Decatur M Test
55  1_2_10         28   Cserum_t 0.000000  26.600 1_2_10   Decatur F Test
56  1_2_10         28   Cserum_t 5.802000  15.200 1_2_10   Decatur F Test
57  1_2_11         29   Cserum_t 0.000000 120.000 1_2_11   Decatur F Test
58  1_2_11         29   Cserum_t 5.802000  61.700 1_2_11   Decatur F Test
59  1_2_12         30   Cserum_t 0.000000  60.900 1_2_12   Decatur F Test
60  1_2_12         30   Cserum_t 5.802000  22.500 1_2_12   Decatur F Test
61  1_2_13         31   Cserum_t 0.000000  41.100 1_2_13   Decatur F Test
62  1_2_13         31   Cserum_t 5.802000  12.400 1_2_13   Decatur F Test
63  1_2_14         32   Cserum_t 0.000000  39.200 1_2_14   Decatur F Test
64  1_2_14         32   Cserum_t 5.802000  12.800 1_2_14   Decatur F Test
65  1_2_15         33   Cserum_t 0.000000  18.100 1_2_15   Decatur F Test
66  1_2_15         33   Cserum_t 5.802000  13.400 1_2_15   Decatur F Test
67  1_2_16         34   Cserum_t 0.000000  19.400 1_2_16   Decatur F Test
68  1_2_16         34   Cserum_t 5.802000  16.800 1_2_16   Decatur F Test
69  1_2_17         35   Cserum_t 0.000000  21.500 1_2_17   Decatur F Test
70  1_2_17         35   Cserum_t 5.802000  11.800 1_2_17   Decatur F Test
71  1_2_18         36   Cserum_t 0.000000  53.800 1_2_18   Decatur F Test
72  1_2_18         36   Cserum_t 5.802000  30.600 1_2_18   Decatur F Test
73  1_2_19         37   Cserum_t 0.000000  16.000 1_2_19   Decatur F Test
74  1_2_19         37   Cserum_t 5.802000   6.700 1_2_19   Decatur F Test
75   1_3_1         38   Cbgd_Css 0.000001  13.000  1_3_1  Minnesota Train
76   1_3_2         39   Cbgd_Css 0.000001  50.000  1_3_2  Minnesota Train
77   1_3_3         40   Cbgd_Css 0.000001  45.000  1_3_3  Minnesota Train
78   1_3_4         41   Cbgd_Css 0.000001  55.000  1_3_4  Minnesota Train
79   1_3_5         42   Cbgd_Css 0.000001  58.000  1_3_5  Minnesota Train
80   1_3_6         43   Cbgd_Css 0.000001  50.000  1_3_6  Minnesota Train
81   1_3_7         44   Cbgd_Css 0.000001 150.000  1_3_7  Minnesota Train
82   1_3_8         45   Cbgd_Css 0.000001  12.000  1_3_8  Minnesota Train
83   1_3_9         46   Cbgd_Css 0.000001  58.000  1_3_9  Minnesota Train
84  1_3_10         47   Cbgd_Css 0.000001  21.000 1_3_10  Minnesota Train
85  1_3_11         48   Cbgd_Css 0.000001  19.000 1_3_11  Minnesota Train
86  1_3_12         49   Cbgd_Css 0.000001  25.000 1_3_12  Minnesota Train
87  1_3_13         50   Cbgd_Css 0.000001   4.000 1_3_13  Minnesota Train
88  1_3_14         51   Cbgd_Css 0.000001  32.000 1_3_14  Minnesota Train
89  1_3_15         52   Cbgd_Css 0.000001  58.000 1_3_15  Minnesota Train
90  1_3_16         53   Cbgd_Css 0.000001   8.500 1_3_16  Minnesota Train
91  1_3_17         54   Cbgd_Css 0.000001   5.500 1_3_17  Minnesota Train
92  1_3_18         55   Cbgd_Css 0.000001  58.000 1_3_18  Minnesota Train
93  1_3_19         56   Cbgd_Css 0.000001  50.000 1_3_19  Minnesota Train
94  1_3_20         57   Cbgd_Css 0.000001 145.000 1_3_20  Minnesota Train
95  1_3_21         58   Cbgd_Css 0.000001  77.000 1_3_21  Minnesota Train
96  1_3_22         59   Cbgd_Css 0.000001  50.000 1_3_22  Minnesota Train
97  1_3_23         60   Cbgd_Css 0.000001  90.000 1_3_23  Minnesota Train
98  1_3_24         61   Cbgd_Css 0.000001  14.000 1_3_24  Minnesota Train
99  1_3_25         62   Cbgd_Css 0.000001  21.000 1_3_25  Minnesota Train
100 1_3_26         63   Cbgd_Css 0.000001  35.000 1_3_26  Minnesota Train
101 1_3_27         64   Cbgd_Css 0.000001  28.000 1_3_27  Minnesota Train
102 1_3_28         65   Cbgd_Css 0.000001   7.000 1_3_28  Minnesota Train
103 1_3_29         66   Cbgd_Css 0.000001 150.000 1_3_29  Minnesota Train
104 1_3_30         67   Cbgd_Css 0.000001  50.000 1_3_30  Minnesota Train
105 1_3_31         68   Cbgd_Css 0.000001  50.000 1_3_31  Minnesota Train
106 1_3_32         69   Cbgd_Css 0.000001  70.000 1_3_32  Minnesota Train
107 1_3_33         70   Cbgd_Css 0.000001  21.000 1_3_33  Minnesota Train
108 1_3_34         71   Cbgd_Css 0.000001  19.000 1_3_34  Minnesota Train
109 1_3_35         72   Cbgd_Css 0.000001  40.000 1_3_35  Minnesota Train
110 1_3_36         73   Cbgd_Css 0.000001  70.000 1_3_36  Minnesota Train
111 1_3_37         74   Cbgd_Css 0.000001  45.000 1_3_37  Minnesota Train
112 1_3_38         75   Cbgd_Css 0.000001  22.000 1_3_38  Minnesota Train
113 1_3_39         76   Cbgd_Css 0.000001  29.000 1_3_39  Minnesota Train
114 1_3_40         77   Cbgd_Css 0.000001  28.000 1_3_40  Minnesota Train
115 1_3_41         78   Cbgd_Css 0.000001   6.500 1_3_41  Minnesota Train
116 1_3_42         79   Cbgd_Css 0.000001  22.000 1_3_42  Minnesota Train
117 1_3_43         80   Cbgd_Css 0.000001  21.000 1_3_43  Minnesota Train
118 1_3_44         81   Cbgd_Css 0.000001  41.000 1_3_44  Minnesota Train
119 1_3_45         82   Cbgd_Css 0.000001  41.000 1_3_45  Minnesota Train
120 1_3_46         83   Cbgd_Css 0.000001  16.000 1_3_46  Minnesota Train
121 1_3_47         84   Cbgd_Css 0.000001  70.000 1_3_47  Minnesota Train
122 1_3_48         85   Cbgd_Css 0.000001  16.000 1_3_48  Minnesota Train
123 1_3_49         86   Cbgd_Css 0.000001  30.000 1_3_49  Minnesota Train
124  1_4_1         87   Cbgd_Css 0.000001   3.000  1_4_1   Minnesota Test
125  1_4_2         88   Cbgd_Css 0.000001   8.700  1_4_2   Minnesota Test
126  1_4_3         89   Cbgd_Css 0.000001   9.000  1_4_3   Minnesota Test
127  1_4_4         90   Cbgd_Css 0.000001  11.000  1_4_4   Minnesota Test
128  1_4_5         91   Cbgd_Css 0.000001  15.000  1_4_5   Minnesota Test
129  1_4_6         92   Cbgd_Css 0.000001  16.000  1_4_6   Minnesota Test
130  1_4_7         93   Cbgd_Css 0.000001  40.000  1_4_7   Minnesota Test
131  1_4_8         94   Cbgd_Css 0.000001  26.000  1_4_8   Minnesota Test
132  1_4_9         95   Cbgd_Css 0.000001  18.000  1_4_9   Minnesota Test
133 1_4_10         96   Cbgd_Css 0.000001  20.000 1_4_10   Minnesota Test
134 1_4_11         97   Cbgd_Css 0.000001  35.000 1_4_11   Minnesota Test
135 1_4_12         98   Cbgd_Css 0.000001  41.000 1_4_12   Minnesota Test
136 1_4_13         99   Cbgd_Css 0.000001  12.000 1_4_13   Minnesota Test
137 1_4_14        100   Cbgd_Css 0.000001  15.000 1_4_14   Minnesota Test
138 1_4_15        101   Cbgd_Css 0.000001  18.000 1_4_15   Minnesota Test
139 1_4_16        102   Cbgd_Css 0.000001  20.000 1_4_16   Minnesota Test
140 1_4_17        103   Cbgd_Css 0.000001  25.000 1_4_17   Minnesota Test
141 1_4_18        104   Cbgd_Css 0.000001  38.000 1_4_18   Minnesota Test
142 1_4_19        105   Cbgd_Css 0.000001 160.000 1_4_19   Minnesota Test
143 1_4_20        106   Cbgd_Css 0.000001  32.000 1_4_20   Minnesota Test
144 1_4_21        107   Cbgd_Css 0.000001   7.000 1_4_21   Minnesota Test
145 1_4_22        108   Cbgd_Css 0.000001  28.000 1_4_22   Minnesota Test
146 1_4_23        109   Cbgd_Css 0.000001  40.000 1_4_23   Minnesota Test
147 1_4_24        110   Cbgd_Css 0.000001  12.000 1_4_24   Minnesota Test
148 1_4_25        111   Cbgd_Css 0.000001  80.000 1_4_25   Minnesota Test
149 1_4_26        112   Cbgd_Css 0.000001  90.000 1_4_26   Minnesota Test
150 1_4_27        113   Cbgd_Css 0.000001  22.000 1_4_27   Minnesota Test
151 1_4_28        114   Cbgd_Css 0.000001  50.000 1_4_28   Minnesota Test
152 1_4_29        115   Cbgd_Css 0.000001  21.000 1_4_29   Minnesota Test
153 1_4_30        116   Cbgd_Css 0.000001  60.000 1_4_30   Minnesota Test
154 1_4_31        117   Cbgd_Css 0.000001  61.000 1_4_31   Minnesota Test
155 1_4_32        118   Cbgd_Css 0.000001 120.000 1_4_32   Minnesota Test
156 1_4_33        119   Cbgd_Css 0.000001  18.000 1_4_33   Minnesota Test
157 1_4_34        120   Cbgd_Css 0.000001  35.000 1_4_34   Minnesota Test
158 1_4_35        121   Cbgd_Css 0.000001  68.000 1_4_35   Minnesota Test
159 1_4_36        122   Cbgd_Css 0.000001  35.000 1_4_36   Minnesota Test
160 1_4_37        123   Cbgd_Css 0.000001  53.000 1_4_37   Minnesota Test
161 1_4_38        124   Cbgd_Css 0.000001  35.000 1_4_38   Minnesota Test
162 1_4_39        125   Cbgd_Css 0.000001  57.000 1_4_39   Minnesota Test
163 1_4_40        126   Cbgd_Css 0.000001  58.000 1_4_40   Minnesota Test
164 1_4_41        127   Cbgd_Css 0.000001  71.000 1_4_41   Minnesota Test
165 1_4_42        128   Cbgd_Css 0.000001  65.000 1_4_42   Minnesota Test
166 1_4_43        129   Cbgd_Css 0.000001  18.000 1_4_43   Minnesota Test
167 1_4_44        130   Cbgd_Css 0.000001  40.000 1_4_44   Minnesota Test
168 1_4_45        131   Cbgd_Css 0.000001  26.000 1_4_45   Minnesota Test
169 1_4_46        132   Cbgd_Css 0.000001  90.000 1_4_46   Minnesota Test
170 1_4_47        133   Cbgd_Css 0.000001  91.000 1_4_47   Minnesota Test
171 1_4_48        134   Cbgd_Css 0.000001 180.000 1_4_48   Minnesota Test
172 1_4_49        135   Cbgd_Css 0.000001 130.000 1_4_49   Minnesota Test
173  1_5_1        136 M_Cbgd_Css 2.200000   7.690  1_5_1  Paulsboro-Train
174  1_6_1        137 M_Cbgd_Css 2.000000  24.639  1_6_1    Horsham-Train
175  1_7_1        138 M_Cbgd_Css 2.000000  21.378  1_7_1  Warminster-Test
176  1_8_1        139 M_Cbgd_Css 2.000000  20.754  1_8_1 Warrington-Train
                  Sex       City Train_Test   datatype             variable
1                Male    Decatur      Train Individual    Decatur M Train 1
2                Male    Decatur      Train Individual    Decatur M Train 1
3                Male    Decatur      Train Individual    Decatur M Train 2
4                Male    Decatur      Train Individual    Decatur M Train 2
5                Male    Decatur      Train Individual    Decatur M Train 3
6                Male    Decatur      Train Individual    Decatur M Train 3
7                Male    Decatur      Train Individual    Decatur M Train 4
8                Male    Decatur      Train Individual    Decatur M Train 4
9                Male    Decatur      Train Individual    Decatur M Train 5
10               Male    Decatur      Train Individual    Decatur M Train 5
11               Male    Decatur      Train Individual    Decatur M Train 6
12               Male    Decatur      Train Individual    Decatur M Train 6
13               Male    Decatur      Train Individual    Decatur M Train 7
14               Male    Decatur      Train Individual    Decatur M Train 7
15               Male    Decatur      Train Individual    Decatur M Train 8
16               Male    Decatur      Train Individual    Decatur M Train 8
17               Male    Decatur      Train Individual    Decatur M Train 9
18               Male    Decatur      Train Individual    Decatur M Train 9
19             Female    Decatur      Train Individual   Decatur F Train 10
20             Female    Decatur      Train Individual   Decatur F Train 10
21             Female    Decatur      Train Individual   Decatur F Train 11
22             Female    Decatur      Train Individual   Decatur F Train 11
23             Female    Decatur      Train Individual   Decatur F Train 12
24             Female    Decatur      Train Individual   Decatur F Train 12
25             Female    Decatur      Train Individual   Decatur F Train 13
26             Female    Decatur      Train Individual   Decatur F Train 13
27             Female    Decatur      Train Individual   Decatur F Train 14
28             Female    Decatur      Train Individual   Decatur F Train 14
29             Female    Decatur      Train Individual   Decatur F Train 15
30             Female    Decatur      Train Individual   Decatur F Train 15
31             Female    Decatur      Train Individual   Decatur F Train 16
32             Female    Decatur      Train Individual   Decatur F Train 16
33             Female    Decatur      Train Individual   Decatur F Train 17
34             Female    Decatur      Train Individual   Decatur F Train 17
35             Female    Decatur      Train Individual   Decatur F Train 18
36             Female    Decatur      Train Individual   Decatur F Train 18
37               Male    Decatur       Test Individual    Decatur M Test 19
38               Male    Decatur       Test Individual    Decatur M Test 19
39               Male    Decatur       Test Individual    Decatur M Test 20
40               Male    Decatur       Test Individual    Decatur M Test 20
41               Male    Decatur       Test Individual    Decatur M Test 21
42               Male    Decatur       Test Individual    Decatur M Test 21
43               Male    Decatur       Test Individual    Decatur M Test 22
44               Male    Decatur       Test Individual    Decatur M Test 22
45               Male    Decatur       Test Individual    Decatur M Test 23
46               Male    Decatur       Test Individual    Decatur M Test 23
47               Male    Decatur       Test Individual    Decatur M Test 24
48               Male    Decatur       Test Individual    Decatur M Test 24
49               Male    Decatur       Test Individual    Decatur M Test 25
50               Male    Decatur       Test Individual    Decatur M Test 25
51               Male    Decatur       Test Individual    Decatur M Test 26
52               Male    Decatur       Test Individual    Decatur M Test 26
53               Male    Decatur       Test Individual    Decatur M Test 27
54               Male    Decatur       Test Individual    Decatur M Test 27
55             Female    Decatur       Test Individual    Decatur F Test 28
56             Female    Decatur       Test Individual    Decatur F Test 28
57             Female    Decatur       Test Individual    Decatur F Test 29
58             Female    Decatur       Test Individual    Decatur F Test 29
59             Female    Decatur       Test Individual    Decatur F Test 30
60             Female    Decatur       Test Individual    Decatur F Test 30
61             Female    Decatur       Test Individual    Decatur F Test 31
62             Female    Decatur       Test Individual    Decatur F Test 31
63             Female    Decatur       Test Individual    Decatur F Test 32
64             Female    Decatur       Test Individual    Decatur F Test 32
65             Female    Decatur       Test Individual    Decatur F Test 33
66             Female    Decatur       Test Individual    Decatur F Test 33
67             Female    Decatur       Test Individual    Decatur F Test 34
68             Female    Decatur       Test Individual    Decatur F Test 34
69             Female    Decatur       Test Individual    Decatur F Test 35
70             Female    Decatur       Test Individual    Decatur F Test 35
71             Female    Decatur       Test Individual    Decatur F Test 36
72             Female    Decatur       Test Individual    Decatur F Test 36
73             Female    Decatur       Test Individual    Decatur F Test 37
74             Female    Decatur       Test Individual    Decatur F Test 37
75  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 38
76  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 39
77  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 40
78  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 41
79  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 42
80  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 43
81  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 44
82  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 45
83  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 46
84  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 47
85  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 48
86  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 49
87  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 50
88  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 51
89  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 52
90  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 53
91  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 54
92  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 55
93  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 56
94  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 57
95  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 58
96  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 59
97  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 60
98  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 61
99  Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 62
100 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 63
101 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 64
102 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 65
103 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 66
104 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 67
105 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 68
106 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 69
107 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 70
108 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 71
109 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 72
110 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 73
111 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 74
112 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 75
113 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 76
114 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 77
115 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 78
116 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 79
117 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 80
118 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 81
119 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 82
120 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 83
121 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 84
122 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 85
123 Mixed (all sexes)  Minnesota      Train Individual   Minnesota Train 86
124 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 87
125 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 88
126 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 89
127 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 90
128 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 91
129 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 92
130 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 93
131 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 94
132 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 95
133 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 96
134 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 97
135 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 98
136 Mixed (all sexes)  Minnesota       Test Individual    Minnesota Test 99
137 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 100
138 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 101
139 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 102
140 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 103
141 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 104
142 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 105
143 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 106
144 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 107
145 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 108
146 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 109
147 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 110
148 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 111
149 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 112
150 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 113
151 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 114
152 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 115
153 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 116
154 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 117
155 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 118
156 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 119
157 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 120
158 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 121
159 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 122
160 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 123
161 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 124
162 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 125
163 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 126
164 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 127
165 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 128
166 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 129
167 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 130
168 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 131
169 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 132
170 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 133
171 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 134
172 Mixed (all sexes)  Minnesota       Test Individual   Minnesota Test 135
173 Mixed (all sexes)  Paulsboro      Train    Summary  Paulsboro-Train 136
174 Mixed (all sexes)    Horsham      Train    Summary    Horsham-Train 137
175 Mixed (all sexes) Warminster       Test    Summary  Warminster-Test 138
176 Mixed (all sexes) Warrington       Test    Summary Warrington-Train 139
                 Dataset   Time.desc                   Dataset.Time
1      Decatur M Train 1         T=0          Decatur M Train 1.T=0
2      Decatur M Train 1     T=5.802      Decatur M Train 1.T=5.802
3      Decatur M Train 2         T=0          Decatur M Train 2.T=0
4      Decatur M Train 2     T=5.802      Decatur M Train 2.T=5.802
5      Decatur M Train 3         T=0          Decatur M Train 3.T=0
6      Decatur M Train 3     T=5.802      Decatur M Train 3.T=5.802
7      Decatur M Train 4         T=0          Decatur M Train 4.T=0
8      Decatur M Train 4     T=5.802      Decatur M Train 4.T=5.802
9      Decatur M Train 5         T=0          Decatur M Train 5.T=0
10     Decatur M Train 5     T=5.802      Decatur M Train 5.T=5.802
11     Decatur M Train 6         T=0          Decatur M Train 6.T=0
12     Decatur M Train 6     T=5.802      Decatur M Train 6.T=5.802
13     Decatur M Train 7         T=0          Decatur M Train 7.T=0
14     Decatur M Train 7     T=5.802      Decatur M Train 7.T=5.802
15     Decatur M Train 8         T=0          Decatur M Train 8.T=0
16     Decatur M Train 8     T=5.802      Decatur M Train 8.T=5.802
17     Decatur M Train 9         T=0          Decatur M Train 9.T=0
18     Decatur M Train 9     T=5.802      Decatur M Train 9.T=5.802
19    Decatur F Train 10         T=0         Decatur F Train 10.T=0
20    Decatur F Train 10     T=5.802     Decatur F Train 10.T=5.802
21    Decatur F Train 11         T=0         Decatur F Train 11.T=0
22    Decatur F Train 11     T=5.802     Decatur F Train 11.T=5.802
23    Decatur F Train 12         T=0         Decatur F Train 12.T=0
24    Decatur F Train 12     T=5.802     Decatur F Train 12.T=5.802
25    Decatur F Train 13         T=0         Decatur F Train 13.T=0
26    Decatur F Train 13     T=5.802     Decatur F Train 13.T=5.802
27    Decatur F Train 14         T=0         Decatur F Train 14.T=0
28    Decatur F Train 14     T=5.802     Decatur F Train 14.T=5.802
29    Decatur F Train 15         T=0         Decatur F Train 15.T=0
30    Decatur F Train 15     T=5.802     Decatur F Train 15.T=5.802
31    Decatur F Train 16         T=0         Decatur F Train 16.T=0
32    Decatur F Train 16     T=5.802     Decatur F Train 16.T=5.802
33    Decatur F Train 17         T=0         Decatur F Train 17.T=0
34    Decatur F Train 17     T=5.802     Decatur F Train 17.T=5.802
35    Decatur F Train 18         T=0         Decatur F Train 18.T=0
36    Decatur F Train 18     T=5.802     Decatur F Train 18.T=5.802
37     Decatur M Test 19         T=0          Decatur M Test 19.T=0
38     Decatur M Test 19     T=5.802      Decatur M Test 19.T=5.802
39     Decatur M Test 20         T=0          Decatur M Test 20.T=0
40     Decatur M Test 20     T=5.802      Decatur M Test 20.T=5.802
41     Decatur M Test 21         T=0          Decatur M Test 21.T=0
42     Decatur M Test 21     T=5.802      Decatur M Test 21.T=5.802
43     Decatur M Test 22         T=0          Decatur M Test 22.T=0
44     Decatur M Test 22     T=5.802      Decatur M Test 22.T=5.802
45     Decatur M Test 23         T=0          Decatur M Test 23.T=0
46     Decatur M Test 23     T=5.802      Decatur M Test 23.T=5.802
47     Decatur M Test 24         T=0          Decatur M Test 24.T=0
48     Decatur M Test 24     T=5.802      Decatur M Test 24.T=5.802
49     Decatur M Test 25         T=0          Decatur M Test 25.T=0
50     Decatur M Test 25     T=5.802      Decatur M Test 25.T=5.802
51     Decatur M Test 26         T=0          Decatur M Test 26.T=0
52     Decatur M Test 26     T=5.802      Decatur M Test 26.T=5.802
53     Decatur M Test 27         T=0          Decatur M Test 27.T=0
54     Decatur M Test 27     T=5.802      Decatur M Test 27.T=5.802
55     Decatur F Test 28         T=0          Decatur F Test 28.T=0
56     Decatur F Test 28     T=5.802      Decatur F Test 28.T=5.802
57     Decatur F Test 29         T=0          Decatur F Test 29.T=0
58     Decatur F Test 29     T=5.802      Decatur F Test 29.T=5.802
59     Decatur F Test 30         T=0          Decatur F Test 30.T=0
60     Decatur F Test 30     T=5.802      Decatur F Test 30.T=5.802
61     Decatur F Test 31         T=0          Decatur F Test 31.T=0
62     Decatur F Test 31     T=5.802      Decatur F Test 31.T=5.802
63     Decatur F Test 32         T=0          Decatur F Test 32.T=0
64     Decatur F Test 32     T=5.802      Decatur F Test 32.T=5.802
65     Decatur F Test 33         T=0          Decatur F Test 33.T=0
66     Decatur F Test 33     T=5.802      Decatur F Test 33.T=5.802
67     Decatur F Test 34         T=0          Decatur F Test 34.T=0
68     Decatur F Test 34     T=5.802      Decatur F Test 34.T=5.802
69     Decatur F Test 35         T=0          Decatur F Test 35.T=0
70     Decatur F Test 35     T=5.802      Decatur F Test 35.T=5.802
71     Decatur F Test 36         T=0          Decatur F Test 36.T=0
72     Decatur F Test 36     T=5.802      Decatur F Test 36.T=5.802
73     Decatur F Test 37         T=0          Decatur F Test 37.T=0
74     Decatur F Test 37     T=5.802      Decatur F Test 37.T=5.802
75    Minnesota Train 38 SteadyState Minnesota Train 38.SteadyState
76    Minnesota Train 39 SteadyState Minnesota Train 39.SteadyState
77    Minnesota Train 40 SteadyState Minnesota Train 40.SteadyState
78    Minnesota Train 41 SteadyState Minnesota Train 41.SteadyState
79    Minnesota Train 42 SteadyState Minnesota Train 42.SteadyState
80    Minnesota Train 43 SteadyState Minnesota Train 43.SteadyState
81    Minnesota Train 44 SteadyState Minnesota Train 44.SteadyState
82    Minnesota Train 45 SteadyState Minnesota Train 45.SteadyState
83    Minnesota Train 46 SteadyState Minnesota Train 46.SteadyState
84    Minnesota Train 47 SteadyState Minnesota Train 47.SteadyState
85    Minnesota Train 48 SteadyState Minnesota Train 48.SteadyState
86    Minnesota Train 49 SteadyState Minnesota Train 49.SteadyState
87    Minnesota Train 50 SteadyState Minnesota Train 50.SteadyState
88    Minnesota Train 51 SteadyState Minnesota Train 51.SteadyState
89    Minnesota Train 52 SteadyState Minnesota Train 52.SteadyState
90    Minnesota Train 53 SteadyState Minnesota Train 53.SteadyState
91    Minnesota Train 54 SteadyState Minnesota Train 54.SteadyState
92    Minnesota Train 55 SteadyState Minnesota Train 55.SteadyState
93    Minnesota Train 56 SteadyState Minnesota Train 56.SteadyState
94    Minnesota Train 57 SteadyState Minnesota Train 57.SteadyState
95    Minnesota Train 58 SteadyState Minnesota Train 58.SteadyState
96    Minnesota Train 59 SteadyState Minnesota Train 59.SteadyState
97    Minnesota Train 60 SteadyState Minnesota Train 60.SteadyState
98    Minnesota Train 61 SteadyState Minnesota Train 61.SteadyState
99    Minnesota Train 62 SteadyState Minnesota Train 62.SteadyState
100   Minnesota Train 63 SteadyState Minnesota Train 63.SteadyState
101   Minnesota Train 64 SteadyState Minnesota Train 64.SteadyState
102   Minnesota Train 65 SteadyState Minnesota Train 65.SteadyState
103   Minnesota Train 66 SteadyState Minnesota Train 66.SteadyState
104   Minnesota Train 67 SteadyState Minnesota Train 67.SteadyState
105   Minnesota Train 68 SteadyState Minnesota Train 68.SteadyState
106   Minnesota Train 69 SteadyState Minnesota Train 69.SteadyState
107   Minnesota Train 70 SteadyState Minnesota Train 70.SteadyState
108   Minnesota Train 71 SteadyState Minnesota Train 71.SteadyState
109   Minnesota Train 72 SteadyState Minnesota Train 72.SteadyState
110   Minnesota Train 73 SteadyState Minnesota Train 73.SteadyState
111   Minnesota Train 74 SteadyState Minnesota Train 74.SteadyState
112   Minnesota Train 75 SteadyState Minnesota Train 75.SteadyState
113   Minnesota Train 76 SteadyState Minnesota Train 76.SteadyState
114   Minnesota Train 77 SteadyState Minnesota Train 77.SteadyState
115   Minnesota Train 78 SteadyState Minnesota Train 78.SteadyState
116   Minnesota Train 79 SteadyState Minnesota Train 79.SteadyState
117   Minnesota Train 80 SteadyState Minnesota Train 80.SteadyState
118   Minnesota Train 81 SteadyState Minnesota Train 81.SteadyState
119   Minnesota Train 82 SteadyState Minnesota Train 82.SteadyState
120   Minnesota Train 83 SteadyState Minnesota Train 83.SteadyState
121   Minnesota Train 84 SteadyState Minnesota Train 84.SteadyState
122   Minnesota Train 85 SteadyState Minnesota Train 85.SteadyState
123   Minnesota Train 86 SteadyState Minnesota Train 86.SteadyState
124    Minnesota Test 87 SteadyState  Minnesota Test 87.SteadyState
125    Minnesota Test 88 SteadyState  Minnesota Test 88.SteadyState
126    Minnesota Test 89 SteadyState  Minnesota Test 89.SteadyState
127    Minnesota Test 90 SteadyState  Minnesota Test 90.SteadyState
128    Minnesota Test 91 SteadyState  Minnesota Test 91.SteadyState
129    Minnesota Test 92 SteadyState  Minnesota Test 92.SteadyState
130    Minnesota Test 93 SteadyState  Minnesota Test 93.SteadyState
131    Minnesota Test 94 SteadyState  Minnesota Test 94.SteadyState
132    Minnesota Test 95 SteadyState  Minnesota Test 95.SteadyState
133    Minnesota Test 96 SteadyState  Minnesota Test 96.SteadyState
134    Minnesota Test 97 SteadyState  Minnesota Test 97.SteadyState
135    Minnesota Test 98 SteadyState  Minnesota Test 98.SteadyState
136    Minnesota Test 99 SteadyState  Minnesota Test 99.SteadyState
137   Minnesota Test 100 SteadyState Minnesota Test 100.SteadyState
138   Minnesota Test 101 SteadyState Minnesota Test 101.SteadyState
139   Minnesota Test 102 SteadyState Minnesota Test 102.SteadyState
140   Minnesota Test 103 SteadyState Minnesota Test 103.SteadyState
141   Minnesota Test 104 SteadyState Minnesota Test 104.SteadyState
142   Minnesota Test 105 SteadyState Minnesota Test 105.SteadyState
143   Minnesota Test 106 SteadyState Minnesota Test 106.SteadyState
144   Minnesota Test 107 SteadyState Minnesota Test 107.SteadyState
145   Minnesota Test 108 SteadyState Minnesota Test 108.SteadyState
146   Minnesota Test 109 SteadyState Minnesota Test 109.SteadyState
147   Minnesota Test 110 SteadyState Minnesota Test 110.SteadyState
148   Minnesota Test 111 SteadyState Minnesota Test 111.SteadyState
149   Minnesota Test 112 SteadyState Minnesota Test 112.SteadyState
150   Minnesota Test 113 SteadyState Minnesota Test 113.SteadyState
151   Minnesota Test 114 SteadyState Minnesota Test 114.SteadyState
152   Minnesota Test 115 SteadyState Minnesota Test 115.SteadyState
153   Minnesota Test 116 SteadyState Minnesota Test 116.SteadyState
154   Minnesota Test 117 SteadyState Minnesota Test 117.SteadyState
155   Minnesota Test 118 SteadyState Minnesota Test 118.SteadyState
156   Minnesota Test 119 SteadyState Minnesota Test 119.SteadyState
157   Minnesota Test 120 SteadyState Minnesota Test 120.SteadyState
158   Minnesota Test 121 SteadyState Minnesota Test 121.SteadyState
159   Minnesota Test 122 SteadyState Minnesota Test 122.SteadyState
160   Minnesota Test 123 SteadyState Minnesota Test 123.SteadyState
161   Minnesota Test 124 SteadyState Minnesota Test 124.SteadyState
162   Minnesota Test 125 SteadyState Minnesota Test 125.SteadyState
163   Minnesota Test 126 SteadyState Minnesota Test 126.SteadyState
164   Minnesota Test 127 SteadyState Minnesota Test 127.SteadyState
165   Minnesota Test 128 SteadyState Minnesota Test 128.SteadyState
166   Minnesota Test 129 SteadyState Minnesota Test 129.SteadyState
167   Minnesota Test 130 SteadyState Minnesota Test 130.SteadyState
168   Minnesota Test 131 SteadyState Minnesota Test 131.SteadyState
169   Minnesota Test 132 SteadyState Minnesota Test 132.SteadyState
170   Minnesota Test 133 SteadyState Minnesota Test 133.SteadyState
171   Minnesota Test 134 SteadyState Minnesota Test 134.SteadyState
172   Minnesota Test 135 SteadyState Minnesota Test 135.SteadyState
173  Paulsboro-Train 136       T=2.2      Paulsboro-Train 136.T=2.2
174    Horsham-Train 137         T=2          Horsham-Train 137.T=2
175  Warminster-Test 138         T=2        Warminster-Test 138.T=2
176 Warrington-Train 139         T=2       Warrington-Train 139.T=2
#Multicheck plot

# Split Steady State Group into different populations for boxplot grouping
#df_check[df_check$Time.desc == "SteadyState" & grepl("Lubeck",df_check$Dataset),]$Time.desc <- "Lubeck"
#df_check[df_check$Time.desc == "SteadyState" & grepl("Little Hocking",df_check$Dataset),]$Time.desc <- "Little Hocking"

Modify aesthetics lookup table for boxplots

##  additional source aesthetic lookup table for grey-scale time (years);  merged legends save space on plotting output
times <- df_check%>% select(Time.desc, Time) %>%  unique () %>% 
  mutate(rank = rank(Time) , grey = grey.colors(start=1,end=0.4, n = n()),
         alpha = (rank)/8) %>% 
  select(-Time)
 
df_check <- df_check %>% mutate (legend_label = (paste0(City, "\n", Time.desc ) )) # add legend-labels
aes_lut <- df_check %>% 
  select(City, Train_Test, datatype,Time, Time.desc, legend_label) %>% unique () %>%
   left_join(aes_lut[, c("City", "cols")], by = "City") %>% ungroup () %>% unique ()%>%
   left_join (times, by = "Time.desc") %>% 
   arrange(datatype, City, Train_Test, Time)    %>% 
   mutate(alpha = if_else(City == "Horsham", alpha/2, alpha)) %>% # otherwise too dark with this color
  mutate_if(is.factor, as.character) 

Decatur boxplots

Changed grey start to 1 instead of 0.8, end at 0.6 instead of 0.4. Changed shape of symbols so they are filled.

 #CD
 # Decatur 

df_decat  <- df_check %>%   
  filter(City == "Decatur" & Train_Test %in% c ("Train", "Test")) %>% 
  mutate(panel = ordered (Train_Test, levels = c ("Train", "Test"), 
                          labels = c("C: PFOS Decatur Train", "D: PFOS Decatur Test") ))

aes_lut_df_df_decat <- aes_lut %>% 
  filter(City == "Decatur" & Train_Test %in% c ("Train", "Test")) %>% 
  mutate_if(is.factor, as.character) 

source( paste0(gsub(basename(here()), 'shared_functions', here()), '/plot_sum_boxplot.r'))


plt_train <- plot_sum_boxplot   (dframe = df_decat, aes_lut= aes_lut_df_df_decat, facets = TRUE , pfas_nom = pfas_name     ) 
print(plt_train)

ggsave(here ("output-plots",paste0( sa,"DecaturTrainTestboxplot",pfas_name,".pdf")),plt_train,dpi=600)
Saving 6.5 x 3.5 in image

All boxplots

Changed grey start to 1 instead of 0.8, end at 0.6 instead of 0.4. Added shapes and fills to data points.

lets <- LETTERS;
names(lets)[1:(length(unique(df_check$dataset))-4)]<-as.character(unique(df_check$dataset))[5:length(unique(df_check$dataset))]

for (d in unique(df_check$dataset)) { # d = unique(df_check$dataset)[11]
    ddset <- df_check %>%    
    filter(dataset == d) 
    
    aes_lut_ddset <- ddset %>% select(legend_label,  City,Train_Test,datatype, Time.desc  ) %>% unique () %>% inner_join(aes_lut)
      
    gt <- ifelse(is.na(lets[d]),d,paste0(lets[d],": ", d))
    plt <- plot_sum_boxplot(dframe = ddset, aes_lut= aes_lut_ddset, gtitle= gt, facets = FALSE, pfas_nom = pfas_name)
     
  print(plt)
  ggsave(here ("output-plots",
                paste0( sa, d,"-boxplot-", 
                pfas_name,".pdf")) ,
         plt,dpi=600)

}
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")
Warning: Column `City` joining factor and character vector, coercing into
character vector
Warning: Column `Train_Test` joining factor and character vector, coercing into
character vector
Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")
Warning: Column `City` joining factor and character vector, coercing into
character vector

Warning: Column `Train_Test` joining factor and character vector, coercing into
character vector

Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")
Warning: Column `City` joining factor and character vector, coercing into
character vector

Warning: Column `Train_Test` joining factor and character vector, coercing into
character vector

Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")
Warning: Column `City` joining factor and character vector, coercing into
character vector

Warning: Column `Train_Test` joining factor and character vector, coercing into
character vector

Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")
Warning: Column `City` joining factor and character vector, coercing into
character vector

Warning: Column `Train_Test` joining factor and character vector, coercing into
character vector

Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")
Warning: Column `City` joining factor and character vector, coercing into
character vector

Warning: Column `Train_Test` joining factor and character vector, coercing into
character vector

Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")
Warning: Column `City` joining factor and character vector, coercing into
character vector

Warning: Column `Train_Test` joining factor and character vector, coercing into
character vector

Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")
Warning: Column `City` joining factor and character vector, coercing into
character vector

Warning: Column `Train_Test` joining factor and character vector, coercing into
character vector

Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")
Warning: Column `City` joining factor and character vector, coercing into
character vector

Warning: Column `Train_Test` joining factor and character vector, coercing into
character vector

Saving 6.5 x 3.5 in image
Joining, by = c("legend_label", "City", "Train_Test", "datatype", "Time.desc")
Warning: Column `City` joining factor and character vector, coercing into
character vector

Warning: Column `Train_Test` joining factor and character vector, coercing into
character vector

Saving 6.5 x 3.5 in image

### make Training plot  

df_d_trt <- df_check %>%   
     filter( (Train_Test == "Train") & ((Output_Var == "M_Cbgd_Css") | (Output_Var == "M_Cserum"))) %>%
     mutate_if(is.factor, as.character) %>%  # drop factor levels unused
     mutate(Dataset.Time = factor(Dataset.Time)) 
 

 aes_lut_df_d_trt <-  df_d_trt %>% select(City, datatype,Time, Time.desc, legend_label) %>% 
   inner_join(aes_lut  ) %>% 
   select(-Train_Test) %>% ungroup () %>% unique ()  
Joining, by = c("City", "datatype", "Time", "Time.desc", "legend_label")
plt_train <-    plot_sum_boxplot(dframe = df_d_trt, aes_lut= aes_lut_df_d_trt,   
                                 gtitle="C: Summary Data - Train" , facets = FALSE, 
                                 pfas_nom = pfas_name )
  print(plt_train)

  ggsave(here ("output-plots", paste0( sa, "SummaryTrainDataboxplot",pfas_name,".pdf")), plt_train,dpi=600)
Saving 6.5 x 3.5 in image
###  make Test plot
df_d_test <- df_check %>%   
    filter((Train_Test == "Test") & 
             ((Output_Var == "M_Cbgd_Css") | (Output_Var == "M_Cserum")))  %>%
     mutate_if(is.factor, as.character) %>%  # drop factor levels unused
     mutate(Dataset.Time = factor(Dataset.Time)) 

aes_lut_df_d_test <-  df_d_test %>% select(City, datatype,Time, Time.desc, legend_label) %>% 
   inner_join(aes_lut  ) %>% 
   select(-Train_Test) %>% ungroup () %>% unique ()  
Joining, by = c("City", "datatype", "Time", "Time.desc", "legend_label")
plt_test <- plot_sum_boxplot(dframe = df_d_test, aes_lut= aes_lut_df_d_test, 
                             gtitle="D: Summary Data - Test", facets = FALSE , 
                             pfas_nom = pfas_name)
  print(plt_test)

  ggsave(here ("output-plots",paste0( sa, "SummaryTestDataboxplot",pfas_name,".pdf")), plt_test,dpi=600)
Saving 6.5 x 3.5 in image

PFOS

Background posteriors

Shows shift in background estimate.

gmscale<-0.8

dat <- multicheck$parms.samp[,grep("M_ln_Cbgd",names(multicheck$parms.samp))]
datasetnames <- as.character(unique(calibdata$dataset))
datasetnames <- gsub(" M","",datasetnames)
datasetnames <- gsub(" F","",datasetnames)
datasetnames<-datasetnames[!duplicated(datasetnames)]
names(dat) <- datasetnames
dat <- dat[,grep("Train",names(dat))]
dat.df <- pivot_longer(dat,1:ncol(dat))
dat.df <- rbind(dat.df,
                data.frame(name="Prior",value=rnorm(5000,m=log(gmscale),sd=0.4055)))
dat.df$name <- factor(dat.df$name,levels=rev(
                        c("Prior",datasetnames[grep("Train",datasetnames)])))
dat.df$value <- exp(dat.df$value)

p<-ggplot(dat.df)+
  #geom_violin(aes(x=name,y=value,fill=name=="Prior"))+
  geom_boxplot(aes(x=name,y=value,fill=name=="Prior"),outlier.shape=NA)+
  scale_y_log10()+coord_flip()+
    scale_fill_manual(name=NULL, 
                    values=c("#009988", "#EE7733" )) +
  theme_classic() +  
  geom_hline(yintercept = gmscale,color="grey")+
  theme(legend.position="none",
      panel.background = element_rect(color="black",size=1))+
  ylab("Posterior shift in Background Concentration")

print(p)

ggsave(here ("output-plots",paste0( sa,"PFOS_GM_Cbgd.pdf"))  , p, dpi=600)
Saving 5 x 6 in image

Half-life

For PFOS, the population GM of the half-life has a posterior distribution that is narrower than the prior, with a posterior median (95% CI) estimate of 3.06 (2.16-4.37) years. The population GSD posterior is larger than the prior at 1.47(1.44-1.75).

dat <- multicheck$parms.samp[,c("M_ln_k.1.","V_ln_k.1.", "M_ln_Vd.1.", "SD_ln_Vd.1.")]
names(dat) <- c("M_ln_k(1)","V_ln_k(1)", "M_ln_Vd(1)", "SD_ln_Vd(1)")
  
set.seed(3.14159)
dat$z_ln_k <- rnorm(nrow(dat))
dat$z_ln_Vd <- rnorm(nrow(dat))
dat %>% rename_()
dat$ln_k_i <- dat$`M_ln_k(1)` + sqrt(dat$`V_ln_k(1)`)*dat$z_ln_k
dat$ln_Vd_i <- dat$`M_ln_Vd(1)`+ dat$`SD_ln_Vd(1)`*dat$z_ln_Vd
linmod <- lm(ln_Vd_i ~ ln_k_i,data=dat)
ggplot(dat) + geom_point(aes(ln_k_i,ln_Vd_i)) + 
  labs(subtitle=paste("Adj R2 =",signif(summary(linmod)$adj.r.squared,2)))

Check normality

qqnorm(dat$ln_k_i,main="ln k Q-Q Normal")
qqline(dat$ln_k_i,col="red")

plot(ecdf(dat$ln_k_i))
x <- seq(-3,1,0.01)
m_ln_k_i <-   mean(dat$ln_k_i)
sd_ln_k_i <- sd(dat$ln_k_i)
lines(x,pnorm(x,mean=m_ln_k_i,sd=sd_ln_k_i),col="red")
text(m_ln_k_i-2*sd_ln_k_i,0.9,paste("m =",signif(m_ln_k_i,4),"\nsd =",signif(sd_ln_k_i,4)))

qqnorm(dat$ln_Vd_i,main="ln Vd Q-Q Normal")
qqline(dat$ln_Vd_i,col="red")

plot(ecdf(dat$ln_Vd_i))
x <- seq(-3,1,0.01)
m_ln_Vd_i <- mean(dat$ln_Vd_i)
sd_ln_Vd_i <- sd(dat$ln_Vd_i)

lines(x,pnorm(x,mean=m_ln_Vd_i,sd=sd_ln_Vd_i),col="red")
text(m_ln_Vd_i-2*sd_ln_Vd_i,0.9,paste("m =",signif(m_ln_Vd_i,4),"\nsd =",signif(sd_ln_Vd_i,4)))

Calculate table values for individual-level

hl_i <- log(2)/ exp(dat$ln_k_i) # individual half-life 
med_hl_i <- paste(signif (median (hl_i), 3)) # median of individual half-life
ci_med_hl_i <-   paste(signif (quantile(hl_i, prob=c(0.025,0.975)), 3),collapse="-") # 95ci med individual halflife
gm_hl_i <- paste(signif (exp(mean(log(hl_i))), 3)) # gm (which should be really close)
gsd_hl_i <- paste(signif (exp(sd(log(hl_i))), 3)) # gsd individual

med_Vd_i <- paste(signif (median(exp(dat$ln_Vd_i)), 3)) # median individual Vd
ci_med_Vd_i <-paste(signif (quantile(exp(dat$ln_Vd_i), prob=c(0.025,0.975)), 3),collapse="-") # 95ci med individual Vd
gm_vd_i <- paste(signif (exp(mean(dat$ln_Vd_i)), 3)) # gm (which should be really close)
gsd_vd_i<- paste(signif (exp(sd(dat$ln_Vd_i)), 3)) # gsd indiv
PFOS_priors <- data.frame(
  halflife_GM= log(2)/rlnorm(50000,
                             meanlog=-1.8971,sdlog=0.4055))
M_k <- exp(as.numeric(dat$`M_ln_k(1)`))
PFOS_halflife_GM <- log(2)/M_k

PFOS_hlgm_pr_med <- signif(median(PFOS_priors$halflife_GM,3))
PFOS_hlgm_pr_med_95ci <-paste(signif(quantile(PFOS_priors$halflife_GM,
                                            prob=c(0.025,0.975)),
                                   3),
                            collapse="-")

PFOS_hl_median_gm <- signif(median(PFOS_halflife_GM),3)
PFOS_hl_median_gm_95ci <- paste(signif(quantile(PFOS_halflife_GM,
                                            prob=c(0.025,0.975)),3),collapse="-")

p<-ggplot()+
  stat_density(aes(halflife_GM, color = "Prior"),data=PFOS_priors,geom="line",size=2)+
  stat_density(aes(PFOS_halflife_GM,stat(density),color="Posterior"),geom="line",size=1.5 )+
  xlim(0,15)+
  labs(title = bquote("C: PFOS"~T[1/2]~"Population GM")  ,
       subtitle=paste("Posterior Median (95% CI): ",
                      PFOS_hl_median_gm," (",
                      PFOS_hl_median_gm_95ci,
                      ")",sep=""))+
  xlab(bquote("Population GM"~T[1/2]~"(yrs)")) +
  scale_color_manual(name=NULL,#
                       values=c(Prior="#009988", Posterior="#EE7733" )) + 
  theme_classic() +  
  theme(legend.title = element_blank(),legend.position=c(0.8,0.7),
      panel.background = element_rect(color="black",size=1),
      legend.background = element_rect(fill="transparent", color=NA))
print(p)
Warning: Removed 80 rows containing non-finite values (stat_density).

ggsave(here ("output-plots",paste0( sa,"PFOS_hl_gm.pdf")), p, dpi=600)
Saving 4 x 2.5 in image
Warning: Removed 80 rows containing non-finite values (stat_density).
PFOS_priors$halflife_GSD =  exp(sqrt(exp(rnorm(50000,m=log(0.2000),sd=log(1.275))))) 
PFOS_halflife_GSD <- exp(sqrt(dat$`V_ln_k(1)`))

PFOS_hlgsd_pr_med <- signif(median(PFOS_priors$halflife_GSD,3))
PFOS_hlgsd_pr_med_95ci <-paste(signif(quantile(PFOS_priors$halflife_GSD,
                                            prob=c(0.025,0.975)),
                                   3),
                            collapse="-")
PFOS_hl_gsd_med <- signif(median(PFOS_halflife_GSD),3)
PFOS_hl_gsd_med_95ci <- paste(signif(quantile(PFOS_halflife_GSD,
                                            prob=c(0.025,0.975)),3),collapse="-")
p<-ggplot()+
  stat_density(aes(halflife_GSD, color = "Prior"),data=PFOS_priors,geom="line",size=2)+
  stat_density(aes(PFOS_halflife_GSD,stat(density), color = "Posterior"),geom="line",size=1.5)+
  xlim(1,3)+
  labs(title = bquote("D: PFOS"~T[1/2]~"Population GSD"), 
       subtitle=paste("Posterior Median (95% CI): ",
                      PFOS_hl_gsd_med," (",
                      PFOS_hl_gsd_med_95ci,
                      ")",sep=""))+
  xlab(bquote("Population GSD"~T[1/2]))+
  scale_color_manual(name=NULL,#
                     values=c(Prior="#009988", Posterior="#EE7733" ))+ 
   theme_classic() +  
  theme(legend.title = element_blank(),legend.position=c(0.8,0.7),
      panel.background = element_rect(color="black",size=1),
      legend.background = element_rect(fill="transparent", color=NA))
print(p)

ggsave(here ("output-plots",paste0( sa, "PFOS_hl_gsd.pdf")), p, dpi=600)

Distribution Volume

For PFOS, the data were not particularly informative, but slightly increased the estimate of the median to 0.308(0.223-0.548) slightly. They were not informative as to the population GSD, with the posterior distributions essentially unchanged from the priors.

PFOS_priors$Vd_GM <- rlnorm(50000,
                             meanlog=-1.46968,
                             sdlog=0.2624)
PFOS_Vd_GM <- exp(dat$`M_ln_Vd(1)`)

 

PFOS_vd_gm_pr_med <- signif(median(PFOS_priors$Vd_GM,3))
PFOS_vd_gm_pr_med_95ci <- paste(signif(quantile(PFOS_priors$Vd_GM,
                                            prob=c(0.025,0.975)), 3), collapse="-")
PFOS_vd_gm_med <- signif(median(PFOS_Vd_GM),3)
PFOS_vd_gm_med_95ci <- paste(signif(quantile(PFOS_Vd_GM,
                                            prob=c(0.025,0.975)),3),collapse="-")

p<-ggplot()+
  stat_density(aes(Vd_GM, color = "Prior"),data=PFOS_priors,geom="line",size=2)+
  stat_density(aes(PFOS_Vd_GM,stat(density), color = "Posterior"),geom="line",size=1.5)+
  xlim(0,1)+labs(title = bquote("C: PFOS"~V[d]~"Population GM"),
                 subtitle=paste("Posterior Median (95% CI): ",
                                PFOS_vd_gm_med," (", 
                                PFOS_vd_gm_med_95ci,")",sep=""))+
   xlab(bquote("Population GM"~V[d]~"(l/kg)"))+
  scale_fill_manual(name=NULL,#
                       values=c(Prior="#009988", Posterior="#EE7733" )) +  theme_classic() +  
  theme(legend.title = element_blank(),legend.position=c(0.8,0.7),
      panel.background = element_rect(color="black",size=1),
      legend.background = element_rect(fill="transparent", color=NA))
print(p)

ggsave(here ("output-plots",paste0( sa, "PFOS_vd_gm.pdf")), p, dpi=600)
PFOS_priors$Vd_GSD = exp(abs(rnorm(50000,sd=0.17)))
PFOS_Vd_GSD <- exp(dat$`SD_ln_Vd(1)`)

PFOS_vd_gsd_pr_med <- signif(median(PFOS_priors$Vd_GSD,3))
PFOS_vd_gsd_pr_med_95ci <- paste(signif(quantile(PFOS_priors$Vd_GSD,
                                            prob=c(0.025,0.975)), 3), collapse="-")

PFOS_vd_gsd_med <- signif(median(PFOS_Vd_GSD),3)
PFOS_vd_gsd_med_95ci <- paste(signif(quantile(PFOS_Vd_GSD,
                                            prob=c(0.025,0.975)),3),collapse="-")

p<-ggplot()+
  stat_density(aes(Vd_GSD, color = "Prior"),data=PFOS_priors,geom="line",size=2)+
  stat_density(aes(PFOS_Vd_GSD,stat(density), color = "Posterior"),geom="line",size=1.5)+
  xlim(1,3)+
  labs(title = bquote("D: PFOS"~V[d]~"Population GSD "),
       subtitle=paste("Posterior Median (95% CI): ",
                      PFOS_vd_gsd_med," (",
                      PFOS_vd_gsd_med_95ci,
                      ")",sep=""))+
 xlab(bquote("Population GSD"~V[d]))+
  scale_color_manual(name=NULL, 
                     values=c(Prior="#009988", Posterior="#EE7733" )) + 
  theme_classic() +  
  theme(legend.title = element_blank(),legend.position=c(0.8,0.7),
      panel.background = element_rect(color="black",size=1),
      legend.background = element_rect(fill="transparent", color=NA))
print(p)

ggsave(here ("output-plots",paste0( sa, "PFOS_vd_gsd.pdf")), p, dpi=600)

Clearance (just pop GM)

Cl is k * Vd

PFOS_priors$CL_GM <- PFOS_priors$Vd_GM * (log(2)/PFOS_priors$halflife_GM)
PFOS_CL_GM <- exp(dat$`M_ln_Vd(1)` + dat$`M_ln_k(1)`)

PFOS_cl_gm_pr_med <- signif(median(PFOS_priors$CL_GM,3))
PFOS_cl_gm_pr_med_95ci <- paste(signif(quantile(PFOS_priors$CL_GM,
                                            prob=c(0.025,0.975)), 3), collapse="-")
PFOS_cl_gm_med <- signif(median(PFOS_CL_GM),3)
PFOS_cl_gm_med_95ci <- paste(signif(quantile(PFOS_CL_GM,
                                            prob=c(0.025,0.975)),3),collapse="-")

p<-ggplot()+
  stat_density(aes(CL_GM, color = "Prior"),data=PFOS_priors,geom="line",size=2)+
  stat_density(aes(PFOS_CL_GM,stat(density), color = "Posterior"),geom="line",size=1.5)+
  xlim(0,0.25)+labs(title = "B: PFOS Clearance Pop. GM ",subtitle=paste("Posterior Median (95% CI): ",
                                                                    PFOS_cl_gm_med," (",
                                                                    PFOS_cl_gm_med_95ci,
                                                                    ")",sep=""))+
  xlab("Pop. GM CL (l/(kg-yr))")+
  scale_color_manual(name=NULL,#
                       values=c(Prior="#009988", Posterior="#EE7733" )) +  
  theme_classic() +  
  theme(legend.title = element_blank(),legend.position=c(0.8,0.7),
      panel.background = element_rect(color="black",size=1),
      legend.background = element_rect(fill="transparent", color=NA))
print(p)

ggsave(here ("output-plots",paste0( sa, "PFOS_CL_gm.pdf")), p, dpi=600)

Table significant digit values

PFOS_hlgm_pr_med <- paste(signif(PFOS_hlgm_pr_med, 3))
PFOS_hl_median_gm<- paste(signif(PFOS_hl_median_gm, 3))
PFOS_hlgsd_pr_med<- paste(signif(PFOS_hlgsd_pr_med, 3))
PFOS_hl_gsd_med<- paste(signif(PFOS_hl_gsd_med, 3))
PFOS_vd_gm_pr_med<- paste(signif(PFOS_vd_gm_pr_med, 3))
PFOS_vd_gm_med<- paste(signif(PFOS_vd_gm_med, 3))
PFOS_vd_gsd_pr_med<- paste(signif(PFOS_vd_gsd_pr_med, 3))
PFOS_vd_gsd_med<- paste(signif(PFOS_vd_gsd_med, 3))
PFOS_cl_gm_pr_med<- paste(signif(PFOS_cl_gm_pr_med, 3))
PFOS_cl_gm_med<- paste(signif(PFOS_cl_gm_med, 3))

Population median estimates [95% CI]

Parameter Prior GM Posterior GM Prior GSD Posterior GSD
Half-life (years) 4.62 3.36 1.56 1.57
HL [95% CI] [2.08-10.3] [2.52-4.42] [1.42-1.77] [1.42-1.76]
Volume of distribution 0.23 0.316 1.12 1.1
\(V_D\) [95% CI] [0.137-0.384] [0.217-0.469] [1.01-1.46] [1.01-1.38]
Clearance 0.0344 0.0663
\(CL\) [95% CI] [0.0133-0.0894] [0.0473-0.09] [] []

Individual Posterior estimates

Parameter median GM [95% CI] GM calculator input GSD individual
Half-life (years) 3.4 [ 1.28-8.42 ] 3.28 1.63
Volume of distribution \(V_D\) 0.319 [ 0.188-0.505 ] 0.318 1.3
─ Session info ───────────────────────────────────────────────────────────────
 setting  value                                      
 version  R version 3.6.1 (2019-07-05)               
 os       Red Hat Enterprise Linux Server 7.9 (Maipo)
 system   x86_64, linux-gnu                          
 ui       X11                                        
 language (EN)                                       
 collate  en_US.UTF-8                                
 ctype    en_US.UTF-8                                
 tz       America/New_York                           
 date     2021-03-02                                 

─ Packages ───────────────────────────────────────────────────────────────────
 package     * version date       lib source        
 assertthat    0.2.1   2019-03-21 [2] CRAN (R 3.6.1)
 backports     1.1.5   2019-10-02 [2] CRAN (R 3.6.1)
 base64enc     0.1-3   2015-07-28 [2] CRAN (R 3.6.1)
 bayesplot   * 1.7.0   2019-05-23 [2] CRAN (R 3.6.1)
 broom         0.5.2   2019-04-07 [2] CRAN (R 3.6.1)
 callr         3.3.2   2019-09-22 [2] CRAN (R 3.6.1)
 cellranger    1.1.0   2016-07-27 [2] CRAN (R 3.6.1)
 cli           1.1.0   2019-03-19 [2] CRAN (R 3.6.1)
 coda        * 0.19-3  2019-07-05 [2] CRAN (R 3.6.1)
 codetools     0.2-16  2018-12-24 [2] CRAN (R 3.6.1)
 colorspace    1.4-1   2019-03-18 [2] CRAN (R 3.6.1)
 crayon        1.3.4   2017-09-16 [2] CRAN (R 3.6.1)
 DBI           1.0.0   2018-05-02 [2] CRAN (R 3.6.1)
 dbplyr        1.4.2   2019-06-17 [2] CRAN (R 3.6.1)
 desc          1.2.0   2018-05-01 [2] CRAN (R 3.6.1)
 devtools      2.2.1   2019-09-24 [2] CRAN (R 3.6.1)
 digest        0.6.23  2019-11-23 [2] CRAN (R 3.6.1)
 dplyr       * 0.8.3   2019-07-04 [2] CRAN (R 3.6.1)
 ellipsis      0.3.0   2019-09-20 [2] CRAN (R 3.6.1)
 evaluate      0.14    2019-05-28 [2] CRAN (R 3.6.1)
 farver        2.0.1   2019-11-13 [2] CRAN (R 3.6.1)
 forcats     * 0.4.0   2019-02-17 [2] CRAN (R 3.6.1)
 fs            1.3.1   2019-05-06 [2] CRAN (R 3.6.1)
 generics      0.0.2   2018-11-29 [2] CRAN (R 3.6.1)
 ggplot2     * 3.2.1   2019-08-10 [2] CRAN (R 3.6.1)
 ggridges      0.5.1   2018-09-27 [2] CRAN (R 3.6.1)
 ggsci       * 2.9     2018-05-14 [2] CRAN (R 3.6.1)
 glue          1.3.1   2019-03-12 [2] CRAN (R 3.6.1)
 gtable        0.3.0   2019-03-25 [2] CRAN (R 3.6.1)
 haven         2.2.0   2019-11-08 [2] CRAN (R 3.6.1)
 here        * 0.1     2017-05-28 [2] CRAN (R 3.6.1)
 hms           0.5.2   2019-10-30 [2] CRAN (R 3.6.1)
 htmltools     0.4.0   2019-10-04 [2] CRAN (R 3.6.1)
 httr          1.4.1   2019-08-05 [2] CRAN (R 3.6.1)
 jsonlite      1.6     2018-12-07 [2] CRAN (R 3.6.1)
 khroma      * 1.4.0   2020-10-05 [1] CRAN (R 3.6.1)
 knitr         1.26    2019-11-12 [2] CRAN (R 3.6.1)
 labeling      0.3     2014-08-23 [2] CRAN (R 3.6.1)
 lattice       0.20-38 2018-11-04 [2] CRAN (R 3.6.1)
 lazyeval      0.2.2   2019-03-15 [2] CRAN (R 3.6.1)
 lifecycle     0.1.0   2019-08-01 [2] CRAN (R 3.6.1)
 lubridate     1.7.4   2018-04-11 [2] CRAN (R 3.6.1)
 magrittr      1.5     2014-11-22 [2] CRAN (R 3.6.1)
 memoise       1.1.0   2017-04-21 [2] CRAN (R 3.6.1)
 modelr        0.1.5   2019-08-08 [2] CRAN (R 3.6.1)
 munsell       0.5.0   2018-06-12 [2] CRAN (R 3.6.1)
 nlme          3.1-142 2019-11-07 [2] CRAN (R 3.6.1)
 pillar        1.4.2   2019-06-29 [2] CRAN (R 3.6.1)
 pkgbuild      1.0.6   2019-10-09 [2] CRAN (R 3.6.1)
 pkgconfig     2.0.3   2019-09-22 [2] CRAN (R 3.6.1)
 pkgload       1.0.2   2018-10-29 [2] CRAN (R 3.6.1)
 plyr          1.8.4   2016-06-08 [2] CRAN (R 3.6.1)
 prettyunits   1.0.2   2015-07-13 [2] CRAN (R 3.6.1)
 processx      3.4.1   2019-07-18 [2] CRAN (R 3.6.1)
 ps            1.3.0   2018-12-21 [2] CRAN (R 3.6.1)
 purrr       * 0.3.3   2019-10-18 [2] CRAN (R 3.6.1)
 R6            2.4.1   2019-11-12 [2] CRAN (R 3.6.1)
 Rcpp          1.0.3   2019-11-08 [2] CRAN (R 3.6.1)
 readr       * 1.3.1   2018-12-21 [2] CRAN (R 3.6.1)
 readxl        1.3.1   2019-03-13 [2] CRAN (R 3.6.1)
 remotes       2.1.0   2019-06-24 [2] CRAN (R 3.6.1)
 reprex        0.3.0   2019-05-16 [2] CRAN (R 3.6.1)
 reshape2    * 1.4.3   2017-12-11 [2] CRAN (R 3.6.1)
 rlang         0.4.2   2019-11-23 [2] CRAN (R 3.6.1)
 rmarkdown     1.18    2019-11-27 [2] CRAN (R 3.6.1)
 rprojroot     1.3-2   2018-01-03 [2] CRAN (R 3.6.1)
 rstudioapi    0.10    2019-03-19 [2] CRAN (R 3.6.1)
 rvest         0.3.5   2019-11-08 [2] CRAN (R 3.6.1)
 scales        1.1.0   2019-11-18 [2] CRAN (R 3.6.1)
 sessioninfo   1.1.1   2018-11-05 [2] CRAN (R 3.6.1)
 stringi       1.4.3   2019-03-12 [2] CRAN (R 3.6.1)
 stringr     * 1.4.0   2019-02-10 [2] CRAN (R 3.6.1)
 testthat      2.3.0   2019-11-05 [2] CRAN (R 3.6.1)
 tibble      * 2.1.3   2019-06-06 [2] CRAN (R 3.6.1)
 tidyr       * 1.0.0   2019-09-11 [2] CRAN (R 3.6.1)
 tidyselect    0.2.5   2018-10-11 [2] CRAN (R 3.6.1)
 tidyverse   * 1.3.0   2019-11-21 [2] CRAN (R 3.6.1)
 usethis       1.5.1   2019-07-04 [2] CRAN (R 3.6.1)
 vctrs         0.2.0   2019-07-05 [2] CRAN (R 3.6.1)
 withr         2.1.2   2018-03-15 [2] CRAN (R 3.6.1)
 xfun          0.11    2019-11-12 [2] CRAN (R 3.6.1)
 xml2          1.2.2   2019-08-09 [2] CRAN (R 3.6.1)
 yaml          2.2.0   2018-07-25 [2] CRAN (R 3.6.1)
 zeallot       0.1.0   2018-01-28 [2] CRAN (R 3.6.1)

[1] /home/ad.abt.local/wchiu/R/library
[2] /opt/R/3.6.1/lib64/R/library
LS0tCnRpdGxlOiAiUEZPUyAxIGNvbXBhcnRtZW50IFBsb3RzICh2OCkiCmF1dGhvcjogIldlaWhzdWVoIENoaXUsIENsYWlyZSBMYXksIFBhcmtlciBNYWxlayIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUYnKWAiCmtuaXQ6IChmdW5jdGlvbihpbnB1dEZpbGUsIGVuY29kaW5nKSB7b3V0ZGlyID0gZmlsZS5wYXRoKGRpcm5hbWUoaW5wdXRGaWxlKSwgJ21hcmtkb3duJywgcGFzdGUwKGZvcm1hdChTeXMudGltZSgpLCAnJUYnKSkpOyBpZighZGlyLmV4aXN0cyhvdXRkaXIpKXtkaXIuY3JlYXRlKG91dGRpcil9OyBybWFya2Rvd246OnJlbmRlcihpbnB1dEZpbGUsIGVuY29kaW5nID0gZW5jb2RpbmcsIG91dHB1dF9mb3JtYXQgPSAnYWxsJywgb3V0cHV0X2RpciA9IG91dGRpcikgfSkKb3V0cHV0OgogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBkZl9wcmludDoga2FibGUKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKLS0tCgpgYGB7ciBzZXR1cH0KbGlicmFyeShjb2RhKQpsaWJyYXJ5KGJheWVzcGxvdCkgCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3NjaSkKbGlicmFyeShraHJvbWEpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KGhlcmUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZHBpID0gMzAwICkKYGBgCgpTZXQgdXAgTUNTaW0gZmlsZQoKYGBge3IgbWNzaW19CiMgdGhpcyBtYXJrZG93biBmaWxlIG11c3QgYmUgc2F2ZWQgaW4gdG9wIGxldmVsIGRpcmVjdG9yeSBmb3IgdGhlIGZvbGxvd2luZyB0byB3b3JrOyB0aGUgbWNzaW0gY29kZSBkZXBlbmRzIG9uIGdldHdkIHJlc3VsdHMuCm1kaXIgPC0gIk1DU2ltIgpzb3VyY2UoaGVyZTo6aGVyZShtZGlyLCJzZXR1cF9NQ1NpbS5SIikpCiMgTWFrZSBtb2QuZXhlICh1c2VkIHRvIGNyZWF0ZSBtY3NpbSBleGVjdXRhYmxlIGZyb20gbW9kZWwgZmlsZSkKbWFrZW1vZCgpIApgYGAKCiMjIFNldCBmaWxlbmFtZXMgYW5kIGxvYWQgZGF0YQoKCmBgYHtyIE1DTUMgIG1vZGVsIGZpbGUsIGluY2x1ZGU9RkFMU0V9CnNldC5zZWVkKDMxNDE1OSkKc2EgPC0gIkNiZ2QtODBfIiAjIEFERCBzZW5zaXRpdml0eSB0ZXN0IHRhZyB0byBwbG90IGZpbGVuYW1lczogTV9sbl9DYmdkX3NjIHRvIGJlIGNlbnRlcmVkIG9uIGxuKDAuOCkgaW5zdGVhZCBvZiAwIChkZWNyZWFzZWQgYnkgMjAlKQojIE1ha2UgbW9kZWwgZXhlY3V0YWJsZQptb2RlbF9maWxlPC0gIlBGQVNfMWNwdF92OC5wb3AuTUNNQy5tb2RlbC5SIgptYWtlbWNzaW0obW9kZWxfZmlsZSkKCmluX2ZpbGUgPC0gIlBGT1NfMWNwdF92OC5Qb3BNQ01DX01lYW5JbmRpdlRyYWluVGVzdC5pbi5SIiAKcGZhc19uYW1lIDwtIGdzdWIoIl8xY3B0X3Y4LlBvcE1DTUNfTWVhbkluZGl2VHJhaW5UZXN0LmluLlIiLCAiIiwgaW5fZmlsZSkKCnNhbXBzIDwtIGRhdGEuZnJhbWUoKQpjaGVja3MgPC0gZGF0YS5mcmFtZSgpCnNhbXBzLmxpc3QgPC0gbGlzdCgpCmZvciAoY2hhaW5udW0gaW4gMTo0KSB7CiAgb25lY2hhaW4gPC0gcmVhZC5kZWxpbShzdWIoIi5pbi5SIixwYXN0ZTAoY2hhaW5udW0sIi5vdXQiKSxpbl9maWxlKSkKICBzYW1wcy5saXN0W1tjaGFpbm51bV1dPC1tY21jKG9uZWNoYWluW2Zsb29yKG5yb3cob25lY2hhaW4pIC8gMik6bnJvdyhvbmVjaGFpbiksIC0xXSkKICBzYW1wcyA8LSByYmluZChzYW1wcyxzYW1wcy5saXN0W1tjaGFpbm51bV1dKQogIG9uZWNoZWNrIDwtIHJlYWQuZGVsaW0oc3ViKCIuaW4uUiIscGFzdGUwKGNoYWlubnVtLCIuY2hlY2sub3V0IiksaW5fZmlsZSkpCiAgb25lY2hlY2skQ2hhaW4gPC0gY2hhaW5udW0KICBjaGVja3MgPC0gcmJpbmQoY2hlY2tzLG9uZWNoZWNrKQp9CnNhbXBzLm1jbWNsaXN0IDwtIGFzLm1jbWMubGlzdChzYW1wcy5saXN0KQoKbG9hZCgiUEZPU18xY3B0X3Y4X211bHRpY2hlY2suUmRhdGEiKQpgYGAKCiMjIFNldCB1cCBkYXRhc2V0CgpgYGB7ciBkYXRhc2V0LUxVVCwgY2FjaGUgPSBUUlVFfQppZF9sdXQgPC0gbXVsdGljaGVjayRkZl9jaGVjayAlPiUgc2VsZWN0KExldmVsKSAlPiUgdW5pcXVlICgpICAlPiUKICBtdXRhdGUoZGF0YXNldCA9IGMoIAogICAgcmVwKCJEZWNhdHVyIE0gVHJhaW4iLCA5KSwKICAgIHJlcCgiRGVjYXR1ciBGIFRyYWluIiwgOSksCiAgICByZXAoIkRlY2F0dXIgTSBUZXN0IiwgOSksCiAgICByZXAoIkRlY2F0dXIgRiBUZXN0IiwgMTApLAogICAgcmVwKCJNaW5uZXNvdGEgVHJhaW4iLCA0OSksCiAgICByZXAoIk1pbm5lc290YSBUZXN0IiwgNDkpLAogICAgJ1BhdWxzYm9yby1UcmFpbicsJ0hvcnNoYW0tVHJhaW4nLAogICAgJ1dhcm1pbnN0ZXItVGVzdCcsJ1dhcnJpbmd0b24tVHJhaW4nKSwgCiAgICBTZXggPSBjKCAKICAgIHJlcCgiTSIsIDkpLAogICAgcmVwKCJGIiwgOSksCiAgICByZXAoIk0iLCA5KSwKICAgIHJlcCgiRiIsIDEwKSwKICAgIHJlcCgiTWl4ZWQiLCA0OSksCiAgICByZXAoIk1peGVkIiwgNDkpLCAKICAgIHJlcCgiTWl4ZWQiLCA0KSksCiAgICBDaXR5ID0gYyggCiAgICByZXAoIkRlY2F0dXIiLCAxOCksCiAgICByZXAoIkRlY2F0dXIiLCAxOSksCiAgICByZXAoIk1pbm5lc290YSIsIDk4KSwKICAgICdQYXVsc2Jvcm8nLCdIb3JzaGFtJywnV2FybWluc3RlcicsJ1dhcnJpbmd0b24nKSwgCiAgICBUcmFpbl9UZXN0ID0gYyggCiAgICByZXAoIlRyYWluIiwgOSksCiAgICByZXAoIlRyYWluIiwgOSksCiAgICByZXAoIlRlc3QiLCA5KSwKICAgIHJlcCgiVGVzdCIsIDEwKSwKICAgIHJlcCgiVHJhaW4iLCA0OSksCiAgICByZXAoIlRlc3QiLCA0OSksCiAgICAnVHJhaW4nLCdUcmFpbicsCiAgICAnVGVzdCcsJ1Rlc3QnKSwKICAgICAgICBkYXRhdHlwZSA9IGMoCiAgICAgIHJlcCgiSW5kaXZpZHVhbCIsOSs5KzkrMTArNDkrNDkpLAogICAgICByZXAoIlN1bW1hcnkiLDQpKSwKICAgIFNpbXVsYXRpb24gPSByb3dfbnVtYmVyKCksCiAgICB2YXJpYWJsZSA9IHBhc3RlMChkYXRhc2V0LCAiICIsU2ltdWxhdGlvbikpCgppZF9sdXQkZGF0YXNldCA8LSBmYWN0b3IoaWRfbHV0JGRhdGFzZXQsbGV2ZWxzPQogICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJEZWNhdHVyIE0gVHJhaW4iLCJEZWNhdHVyIEYgVHJhaW4iLCJBcm5zYmVyZyBNIFRyYWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJuc2JlcmcgRiBUcmFpbiIsIkRlY2F0dXIgTSBUZXN0IiwiRGVjYXR1ciBGIFRlc3QiLCJBcm5zYmVyZyBNIFRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcm5zYmVyZyBGIFRlc3QiLCJNaW5uZXNvdGEgVHJhaW4iLCJNaW5uZXNvdGEgVGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0x1YmVjay1CYXJ0ZWxsLVRyYWluJywgJ0x1YmVjay1CYXJ0ZWxsLVRlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMaXR0bGUgSG9ja2luZy1CYXJ0ZWxsLVRyYWluJywgJ0xpdHRsZSBIb2NraW5nLUJhcnRlbGwtVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xpdHRsZSBIb2NraW5nLUVtbWV0dC1UZXN0JywnUGF1bHNib3JvLVRyYWluJywnSG9yc2hhbS1UcmFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dhcm1pbnN0ZXItVGVzdCcsJ1dhcnJpbmd0b24tVHJhaW4nKSkKaWRfbHV0JENpdHkgPC0gZmFjdG9yKGlkX2x1dCRDaXR5LGxldmVscyA9IAogICAgICAgICAgICAgICAgICAgICAgICBjKCJEZWNhdHVyIiwiQXJuc2JlcmciLCJNaW5uZXNvdGEiLCdMdWJlY2stQmFydGVsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xpdHRsZSBIb2NraW5nLUJhcnRlbGwnLCdMaXR0bGUgSG9ja2luZy1FbW1ldHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICdQYXVsc2Jvcm8nLCdIb3JzaGFtJywnV2FybWluc3RlcicsJ1dhcnJpbmd0b24nKSkKIAoKaW5kaXZfbHV0IDwtIGlkX2x1dCAlPiUgCiAgZmlsdGVyKENpdHkgJWluJSBjKCJEZWNhdHVyIiwgIk1pbm5lc290YSIpKSAlPiUKICBtdXRhdGUoICBkYXRhc2V0ID0gYXMuZmFjdG9yKGRhdGFzZXQpKQoKbnYgPC0gZGF0YS5mcmFtZShkYXRhc2V0ID11bmlxdWUoaW5kaXZfbHV0JGRhdGFzZXQpLCAKICAgICAgICAgICB2YXJpYWJsZT0gcmVwKCJQb3AgR00iLCA2KSwKICAgICAgICAgICB0eXBlPSByZXAoIlBvcCBHTSIsIDYpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmBgYAoKCiMjIFNjYXR0ZXIgcGxvdCBvZiBwcmVkaWN0aW9ucyAobWVkaWFuIG9mIG11bHRpY2hlY2sgc2FtcGxlcykgdmVyc3VzIGRhdGEuCgpUaGlzIGlzIGEgRmlndXJlIDIgcGFuZWwuICBOZWVkZWQgdG8gdXNlICJzY2FsZT0xLjEiIGluIGdnc2F2ZSB0byBtYXRjaCBQRk9BLgoKYGBge3IgcHJlZGljdGlvbi12ZXJzdXMtZGF0YSAsIGNhY2hlID0gVFJVRSxmaWcuaGVpZ2h0PTMuNSxmaWcud2lkdGg9OCxkcGk9NjAwfQpucm93KG11bHRpY2hlY2skZGZfY2hlY2spCm5yb3coaWRfbHV0KQptdWx0aWNoZWNrJGRmX2NoZWNrICU+JSBsZWZ0X2pvaW4oaWRfbHV0KSAlPiUgbnJvdygpCgpuYW1lcyhtdWx0aWNoZWNrJGRmX2NoZWNrKQoKbXVsdGljaGVjazIgPC0gbXVsdGljaGVjayRkZl9jaGVjayAlPiUgbGVmdF9qb2luKGlkX2x1dCklPiUgCiAgZ3JvdXBfYnlfYXQgKCB2YXJzKC1QcmVkaWN0aW9uKSkgJT4lIAogIHN1bW1hcmlzZShQcmVkaWN0aW9uID0gbWVkaWFuKFByZWRpY3Rpb24pKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoQ2l0eSkgJT4lIAogIG11dGF0ZShUcmFpbl9UZXN0ID0gZmFjdG9yKFRyYWluX1Rlc3QsIGxldmVscyA9IGMoIlRyYWluIiwgIlRlc3QiKSksCiAgICAgICAgIGBDaXR5IChkYXRhdHlwZSlgID0gZmFjdG9yIChwYXN0ZTAoQ2l0eSwgIlxuKCIsIGRhdGF0eXBlLCAiKVxuIikgKSwKICAgICAgICAgbGFiZWwgPSBjYXNlX3doZW4oVHJhaW5fVGVzdD09IlRyYWluIiB+ICJDOiBQRk9TIFRyYWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaW5fVGVzdD09IlRlc3QiICB+IkQ6IFBGT1MgVGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiIikpCiAjZGVmaW5lIGNvbG9yIGZvciB0ZXN0aW5nIGJveHBsb3RzCmJwX2NvbHMgPC0gYyAoYXMuY2hhcmFjdGVyIChraHJvbWE6OmNvbG91cigibXV0ZWQiKSg5KSkgLCAiIzE5MTkxOSIpICAgCmJwX2NvbHMgPC1icF9jb2xzW2MoMSwzLCA3LCAxMDo4KV0jIHBsb3Rfc2NoZW1lX2NvbG91cmJsaW5kKGJwX2NvbHMpIAoKIyMjIENyZWF0ZSBhZXN0aGV0aWNzIGxvb2t1cAphZXNfbHV0IDwtIG11bHRpY2hlY2syICU+JSB1bmdyb3VwKCkgJT4lIAogIGdyb3VwX2J5KENpdHksIGRhdGF0eXBlLCAgYENpdHkgKGRhdGF0eXBlKWAgKSAlPiUgc3VtbWFyaXNlICgpICU+JSB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKCBjb2xzID0gYnBfY29scywgY2l0eV9maWxscyA9ICAgYnBfY29scyAsIAogICAgICAgICAgIyBmb3IgaW5kaXZpZHVhbCBsZXZlbCBvbiBwb2ludCBwbG90IChtdWx0aWNoZWNrMiksIGRhcmtlbiBvdXRsaW5lcyBmb3IgdmlzaWJpbGl0eSwgdXNlIHN0YW5kYXJkIGNvbG9ycyBvdGhlcndpc2UKICAgICAgICAgY2l0eV9vdXRsaW5lcyA9ICBpZl9lbHNlKGRhdGF0eXBlID09ICJJbmRpdmlkdWFsIiAgLCAgY29sb3JzcGFjZTo6ZGFya2VuKGNpdHlfZmlsbHMsIDAuMyksIGNpdHlfZmlsbHMpICwgIAogICAgICAgICBzaGFwZXMgPSBjYXNlX3doZW4oZGF0YXR5cGUgPT0gIkluZGl2aWR1YWwiICAmIGBDaXR5YCAlaW4lIGMoJ0RlY2F0dXInLCAnQXJuc2JlcmcnLCAnTWlubmVzb3RhJykgICB+ICAyMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGF0eXBlID09ICJTdW1tYXJ5IiAmYENpdHlgICVpbiUgYygiSG9yc2hhbSIsICJXYXJtaW5zdGVyIiwgICJXYXJyaW5ndG9uIikgfiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXR5cGUgPT0gIlN1bW1hcnkiICYgYENpdHlgID09ICJQYXVsc2Jvcm8iIH4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwgCiAgICAgICAgIHNpemUgPSBpZl9lbHNlKGRhdGF0eXBlID09IkluZGl2aWR1YWwiLCAxLjc1LCAyLjUgKSApICAKCgoKc291cmNlKCBwYXN0ZTAoZ3N1YihiYXNlbmFtZShoZXJlKCkpLCAnc2hhcmVkX2Z1bmN0aW9ucycsIGhlcmUoKSksICcvcGxvdF9zY2F0dGVyX21jaGVjay5yJykpCgpwMiA8LSBwbG90X3NjYXR0ZXJfbWNoZWNrKGRmcmFtZSA9IG11bHRpY2hlY2syLCAgcGZhc19ub20gPSBwZmFzX25hbWUsIGFlc19sdXRfZm4gPSBhZXNfbHV0ICkKcHJpbnQocDIpIApnZ3NhdmUoaGVyZSAoIm91dHB1dC1wbG90cyIsIHBhc3RlMCggc2EsIm11bHRpY2hlY2twbG90XyIsIHBmYXNfbmFtZSwKICAgICAgICAgICAgICAgIi5wZGYiKSkscDIsZHBpPTYwMCwgc2NhbGU9MS4xKQoKCmBgYAoKIyMgUGFyc2UgbXVsdGljaGVjawoKYGBge3IgZG8tbXVsdGljaGVjaywgY2FjaGUgPSBUUlVFLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0xOH0KCmRmX2NoZWNrIDwtIG11bHRpY2hlY2skZGZfY2hlY2sKZGZfY2hlY2sgPC0gc3Vic2V0KGRmX2NoZWNrLERhdGEgPiAwKSAKCm4xIDwtIG5yb3coZGZfY2hlY2spCmlkX2Noa3MgPC0gZGZfY2hlY2sgJT4lIHNlbGVjdChMZXZlbCkgJT4lIHVuaXF1ZSgpICU+JSBiaW5kX2NvbHMoaWRfbHV0KSAgJT4lCiBtdXRhdGUoZGF0YXNldCA9IGFzLmZhY3RvcihkYXRhc2V0KSwgU2V4ID0gYXMuZmFjdG9yKFNleCksIENpdHkgPSBhcy5mYWN0b3IoQ2l0eSksIAogICAgICAgICBUcmFpbl9UZXN0ID0gYXMuZmFjdG9yKFRyYWluX1Rlc3QpKQoKZGZfY2hlY2sgPC0gZGZfY2hlY2sgJT4lIGxlZnRfam9pbihpZF9jaGtzKSU+JQogIG11dGF0ZShEYXRhc2V0ID0gcGFzdGUoYXMuY2hhcmFjdGVyKGRhdGFzZXQpLCBTaW11bGF0aW9uKSwKICAgICAgICAgU2V4ID0gb3JkZXJlZChTZXgsIGxldmVscyA9IGMoIk0iLCAiRiIsICJNaXhlZCIpLCAKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJNYWxlIiwgIkZlbWFsZSIsICJNaXhlZCAoYWxsIHNleGVzKSIpKSkKbjIgPC0gbnJvdyhkZl9jaGVjaykKaWYobjEgIT0gbjIpcHJpbnQoImR1cGxpY2F0ZXMgY3JlYXRlZCBpbiBpZC1sdXQgam9pbiIpCmBgYAoKCmBgYHtyIGRvLW11bHRpY2hlY2stMiwgY2FjaGUgPSBUUlVFLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0xOH0KZGZfY2hlY2skVGltZS5kZXNjIDwtIGFzLmNoYXJhY3RlcihwYXN0ZTAoIlQ9IixkZl9jaGVjayRUaW1lKSkKZGZfY2hlY2skVGltZS5kZXNjW2RmX2NoZWNrJFRpbWUuZGVzYyA9PSAiVD0xZS0wNiJdIDwtICJTdGVhZHlTdGF0ZSIKZGZfY2hlY2skRGF0YXNldC5UaW1lIDwtIGludGVyYWN0aW9uKGRmX2NoZWNrJERhdGFzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZl9jaGVjayRUaW1lLmRlc2MsbGV4Lm9yZGVyPVRSVUUpCmRmX2NoZWNrJERhdGFzZXQuVGltZSA8LSBmYWN0b3IoZGZfY2hlY2skRGF0YXNldC5UaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1sZXZlbHMoZGZfY2hlY2skRGF0YXNldC5UaW1lKSkKY2FsaWJkYXRhIDwtIGRmX2NoZWNrWyxuYW1lcyhkZl9jaGVjaykgIT0gIlByZWRpY3Rpb24iXQpjYWxpYmRhdGEgPC0gY2FsaWJkYXRhWyFkdXBsaWNhdGVkKGNhbGliZGF0YSksXQpwcmludChjYWxpYmRhdGEpCiAKI011bHRpY2hlY2sgcGxvdAoKIyBTcGxpdCBTdGVhZHkgU3RhdGUgR3JvdXAgaW50byBkaWZmZXJlbnQgcG9wdWxhdGlvbnMgZm9yIGJveHBsb3QgZ3JvdXBpbmcKI2RmX2NoZWNrW2RmX2NoZWNrJFRpbWUuZGVzYyA9PSAiU3RlYWR5U3RhdGUiICYgZ3JlcGwoIkx1YmVjayIsZGZfY2hlY2skRGF0YXNldCksXSRUaW1lLmRlc2MgPC0gIkx1YmVjayIKI2RmX2NoZWNrW2RmX2NoZWNrJFRpbWUuZGVzYyA9PSAiU3RlYWR5U3RhdGUiICYgZ3JlcGwoIkxpdHRsZSBIb2NraW5nIixkZl9jaGVjayREYXRhc2V0KSxdJFRpbWUuZGVzYyA8LSAiTGl0dGxlIEhvY2tpbmciCmBgYAoKTW9kaWZ5IGFlc3RoZXRpY3MgbG9va3VwIHRhYmxlIGZvciBib3hwbG90cyAKYGBge3IgbW9kLWFlcy1sdXR9CiMjICBhZGRpdGlvbmFsIHNvdXJjZSBhZXN0aGV0aWMgbG9va3VwIHRhYmxlIGZvciBncmV5LXNjYWxlIHRpbWUgKHllYXJzKTsgIG1lcmdlZCBsZWdlbmRzIHNhdmUgc3BhY2Ugb24gcGxvdHRpbmcgb3V0cHV0CnRpbWVzIDwtIGRmX2NoZWNrJT4lIHNlbGVjdChUaW1lLmRlc2MsIFRpbWUpICU+JSAgdW5pcXVlICgpICU+JSAKICBtdXRhdGUocmFuayA9IHJhbmsoVGltZSkgLCBncmV5ID0gZ3JleS5jb2xvcnMoc3RhcnQ9MSxlbmQ9MC40LCBuID0gbigpKSwKICAgICAgICAgYWxwaGEgPSAocmFuaykvOCkgJT4lIAogIHNlbGVjdCgtVGltZSkKIApkZl9jaGVjayA8LSBkZl9jaGVjayAlPiUgbXV0YXRlIChsZWdlbmRfbGFiZWwgPSAocGFzdGUwKENpdHksICJcbiIsIFRpbWUuZGVzYyApICkpICMgYWRkIGxlZ2VuZC1sYWJlbHMKYWVzX2x1dCA8LSBkZl9jaGVjayAlPiUgCiAgc2VsZWN0KENpdHksIFRyYWluX1Rlc3QsIGRhdGF0eXBlLFRpbWUsIFRpbWUuZGVzYywgbGVnZW5kX2xhYmVsKSAlPiUgdW5pcXVlICgpICU+JQogICBsZWZ0X2pvaW4oYWVzX2x1dFssIGMoIkNpdHkiLCAiY29scyIpXSwgYnkgPSAiQ2l0eSIpICU+JSB1bmdyb3VwICgpICU+JSB1bmlxdWUgKCklPiUKICAgbGVmdF9qb2luICh0aW1lcywgYnkgPSAiVGltZS5kZXNjIikgJT4lIAogICBhcnJhbmdlKGRhdGF0eXBlLCBDaXR5LCBUcmFpbl9UZXN0LCBUaW1lKSAgICAlPiUgCiAgIG11dGF0ZShhbHBoYSA9IGlmX2Vsc2UoQ2l0eSA9PSAiSG9yc2hhbSIsIGFscGhhLzIsIGFscGhhKSkgJT4lICMgb3RoZXJ3aXNlIHRvbyBkYXJrIHdpdGggdGhpcyBjb2xvcgogIG11dGF0ZV9pZihpcy5mYWN0b3IsIGFzLmNoYXJhY3RlcikgCgpgYGAKCgojIyBEZWNhdHVyIGJveHBsb3RzCgpDaGFuZ2VkIGdyZXkgc3RhcnQgdG8gMSBpbnN0ZWFkIG9mIDAuOCwgZW5kIGF0IDAuNiBpbnN0ZWFkIG9mIDAuNC4KQ2hhbmdlZCBzaGFwZSBvZiBzeW1ib2xzIHNvIHRoZXkgYXJlIGZpbGxlZC4KCmBgYHtyIGRvLW11bHRpY2hlY2stZGVjYXR1ciwgY2FjaGUgPSBUUlVFLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTMuNSxkcGk9NjAwfQogI0NECiAjIERlY2F0dXIgCgpkZl9kZWNhdCAgPC0gZGZfY2hlY2sgJT4lICAgCiAgZmlsdGVyKENpdHkgPT0gIkRlY2F0dXIiICYgVHJhaW5fVGVzdCAlaW4lIGMgKCJUcmFpbiIsICJUZXN0IikpICU+JSAKICBtdXRhdGUocGFuZWwgPSBvcmRlcmVkIChUcmFpbl9UZXN0LCBsZXZlbHMgPSBjICgiVHJhaW4iLCAiVGVzdCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDOiBQRk9TIERlY2F0dXIgVHJhaW4iLCAiRDogUEZPUyBEZWNhdHVyIFRlc3QiKSApKQoKYWVzX2x1dF9kZl9kZl9kZWNhdCA8LSBhZXNfbHV0ICU+JSAKICBmaWx0ZXIoQ2l0eSA9PSAiRGVjYXR1ciIgJiBUcmFpbl9UZXN0ICVpbiUgYyAoIlRyYWluIiwgIlRlc3QiKSkgJT4lIAogIG11dGF0ZV9pZihpcy5mYWN0b3IsIGFzLmNoYXJhY3RlcikgCgpzb3VyY2UoIHBhc3RlMChnc3ViKGJhc2VuYW1lKGhlcmUoKSksICdzaGFyZWRfZnVuY3Rpb25zJywgaGVyZSgpKSwgJy9wbG90X3N1bV9ib3hwbG90LnInKSkKCgpwbHRfdHJhaW4gPC0gcGxvdF9zdW1fYm94cGxvdCAgIChkZnJhbWUgPSBkZl9kZWNhdCwgYWVzX2x1dD0gYWVzX2x1dF9kZl9kZl9kZWNhdCwgZmFjZXRzID0gVFJVRSAsIHBmYXNfbm9tID0gcGZhc19uYW1lICAgICApIApwcmludChwbHRfdHJhaW4pCmdnc2F2ZShoZXJlICgib3V0cHV0LXBsb3RzIixwYXN0ZTAoIHNhLCJEZWNhdHVyVHJhaW5UZXN0Ym94cGxvdCIscGZhc19uYW1lLCIucGRmIikpLHBsdF90cmFpbixkcGk9NjAwKQoKYGBgCgojIyBBbGwgYm94cGxvdHMKCkNoYW5nZWQgZ3JleSBzdGFydCB0byAxIGluc3RlYWQgb2YgMC44LCBlbmQgYXQgMC42IGluc3RlYWQgb2YgMC40LgpBZGRlZCBzaGFwZXMgYW5kIGZpbGxzIHRvIGRhdGEgcG9pbnRzLgoKYGBge3IgZG8tbXVsdGljaGVjay1hbGwsIGNhY2hlID0gVFJVRSwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD0zLjUsZHBpPTYwMH0KbGV0cyA8LSBMRVRURVJTOwpuYW1lcyhsZXRzKVsxOihsZW5ndGgodW5pcXVlKGRmX2NoZWNrJGRhdGFzZXQpKS00KV08LWFzLmNoYXJhY3Rlcih1bmlxdWUoZGZfY2hlY2skZGF0YXNldCkpWzU6bGVuZ3RoKHVuaXF1ZShkZl9jaGVjayRkYXRhc2V0KSldCgpmb3IgKGQgaW4gdW5pcXVlKGRmX2NoZWNrJGRhdGFzZXQpKSB7ICMgZCA9IHVuaXF1ZShkZl9jaGVjayRkYXRhc2V0KVsxMV0KICAgIGRkc2V0IDwtIGRmX2NoZWNrICU+JSAgICAKICAgIGZpbHRlcihkYXRhc2V0ID09IGQpIAogICAgCiAgICBhZXNfbHV0X2Rkc2V0IDwtIGRkc2V0ICU+JSBzZWxlY3QobGVnZW5kX2xhYmVsLCAgQ2l0eSxUcmFpbl9UZXN0LGRhdGF0eXBlLCBUaW1lLmRlc2MgICkgJT4lIHVuaXF1ZSAoKSAlPiUgaW5uZXJfam9pbihhZXNfbHV0KQogICAgICAKICAgIGd0IDwtIGlmZWxzZShpcy5uYShsZXRzW2RdKSxkLHBhc3RlMChsZXRzW2RdLCI6ICIsIGQpKQogICAgcGx0IDwtIHBsb3Rfc3VtX2JveHBsb3QoZGZyYW1lID0gZGRzZXQsIGFlc19sdXQ9IGFlc19sdXRfZGRzZXQsIGd0aXRsZT0gZ3QsIGZhY2V0cyA9IEZBTFNFLCBwZmFzX25vbSA9IHBmYXNfbmFtZSkKICAgICAKICBwcmludChwbHQpCiAgZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLAogICAgICAgICAgICAgICAgcGFzdGUwKCBzYSwgZCwiLWJveHBsb3QtIiwgCiAgICAgICAgICAgICAgICBwZmFzX25hbWUsIi5wZGYiKSkgLAogICAgICAgICBwbHQsZHBpPTYwMCkKCn0KCiMjIyBtYWtlIFRyYWluaW5nIHBsb3QgIAoKZGZfZF90cnQgPC0gZGZfY2hlY2sgJT4lICAgCiAgICAgZmlsdGVyKCAoVHJhaW5fVGVzdCA9PSAiVHJhaW4iKSAmICgoT3V0cHV0X1ZhciA9PSAiTV9DYmdkX0NzcyIpIHwgKE91dHB1dF9WYXIgPT0gIk1fQ3NlcnVtIikpKSAlPiUKICAgICBtdXRhdGVfaWYoaXMuZmFjdG9yLCBhcy5jaGFyYWN0ZXIpICU+JSAgIyBkcm9wIGZhY3RvciBsZXZlbHMgdW51c2VkCiAgICAgbXV0YXRlKERhdGFzZXQuVGltZSA9IGZhY3RvcihEYXRhc2V0LlRpbWUpKSAKIAoKIGFlc19sdXRfZGZfZF90cnQgPC0gIGRmX2RfdHJ0ICU+JSBzZWxlY3QoQ2l0eSwgZGF0YXR5cGUsVGltZSwgVGltZS5kZXNjLCBsZWdlbmRfbGFiZWwpICU+JSAKICAgaW5uZXJfam9pbihhZXNfbHV0ICApICU+JSAKICAgc2VsZWN0KC1UcmFpbl9UZXN0KSAlPiUgdW5ncm91cCAoKSAlPiUgdW5pcXVlICgpICAKCnBsdF90cmFpbiA8LSAgICBwbG90X3N1bV9ib3hwbG90KGRmcmFtZSA9IGRmX2RfdHJ0LCBhZXNfbHV0PSBhZXNfbHV0X2RmX2RfdHJ0LCAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGl0bGU9IkM6IFN1bW1hcnkgRGF0YSAtIFRyYWluIiAsIGZhY2V0cyA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZhc19ub20gPSBwZmFzX25hbWUgKQogIHByaW50KHBsdF90cmFpbikKICBnZ3NhdmUoaGVyZSAoIm91dHB1dC1wbG90cyIsIHBhc3RlMCggc2EsICJTdW1tYXJ5VHJhaW5EYXRhYm94cGxvdCIscGZhc19uYW1lLCIucGRmIikpLCBwbHRfdHJhaW4sZHBpPTYwMCkKCiMjIyAgbWFrZSBUZXN0IHBsb3QKZGZfZF90ZXN0IDwtIGRmX2NoZWNrICU+JSAgIAogICAgZmlsdGVyKChUcmFpbl9UZXN0ID09ICJUZXN0IikgJiAKICAgICAgICAgICAgICgoT3V0cHV0X1ZhciA9PSAiTV9DYmdkX0NzcyIpIHwgKE91dHB1dF9WYXIgPT0gIk1fQ3NlcnVtIikpKSAgJT4lCiAgICAgbXV0YXRlX2lmKGlzLmZhY3RvciwgYXMuY2hhcmFjdGVyKSAlPiUgICMgZHJvcCBmYWN0b3IgbGV2ZWxzIHVudXNlZAogICAgIG11dGF0ZShEYXRhc2V0LlRpbWUgPSBmYWN0b3IoRGF0YXNldC5UaW1lKSkgCgphZXNfbHV0X2RmX2RfdGVzdCA8LSAgZGZfZF90ZXN0ICU+JSBzZWxlY3QoQ2l0eSwgZGF0YXR5cGUsVGltZSwgVGltZS5kZXNjLCBsZWdlbmRfbGFiZWwpICU+JSAKICAgaW5uZXJfam9pbihhZXNfbHV0ICApICU+JSAKICAgc2VsZWN0KC1UcmFpbl9UZXN0KSAlPiUgdW5ncm91cCAoKSAlPiUgdW5pcXVlICgpICAKCnBsdF90ZXN0IDwtIHBsb3Rfc3VtX2JveHBsb3QoZGZyYW1lID0gZGZfZF90ZXN0LCBhZXNfbHV0PSBhZXNfbHV0X2RmX2RfdGVzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpdGxlPSJEOiBTdW1tYXJ5IERhdGEgLSBUZXN0IiwgZmFjZXRzID0gRkFMU0UgLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZmFzX25vbSA9IHBmYXNfbmFtZSkKICBwcmludChwbHRfdGVzdCkKICBnZ3NhdmUoaGVyZSAoIm91dHB1dC1wbG90cyIscGFzdGUwKCBzYSwgIlN1bW1hcnlUZXN0RGF0YWJveHBsb3QiLHBmYXNfbmFtZSwiLnBkZiIpKSwgcGx0X3Rlc3QsZHBpPTYwMCkKIApgYGAKCiMjIFBGT1MKIyMjIEJhY2tncm91bmQgcG9zdGVyaW9ycwoKU2hvd3Mgc2hpZnQgaW4gYmFja2dyb3VuZCBlc3RpbWF0ZS4KCmBgYHtyIGdldCBiYWNrZ3JvdW5kLCBjYWNoZSA9IFRSVUUsZmlnLmhlaWdodD02LGZpZy53aWR0aD01LGRwaT02MDB9CgpnbXNjYWxlPC0wLjgKCmRhdCA8LSBtdWx0aWNoZWNrJHBhcm1zLnNhbXBbLGdyZXAoIk1fbG5fQ2JnZCIsbmFtZXMobXVsdGljaGVjayRwYXJtcy5zYW1wKSldCmRhdGFzZXRuYW1lcyA8LSBhcy5jaGFyYWN0ZXIodW5pcXVlKGNhbGliZGF0YSRkYXRhc2V0KSkKZGF0YXNldG5hbWVzIDwtIGdzdWIoIiBNIiwiIixkYXRhc2V0bmFtZXMpCmRhdGFzZXRuYW1lcyA8LSBnc3ViKCIgRiIsIiIsZGF0YXNldG5hbWVzKQpkYXRhc2V0bmFtZXM8LWRhdGFzZXRuYW1lc1shZHVwbGljYXRlZChkYXRhc2V0bmFtZXMpXQpuYW1lcyhkYXQpIDwtIGRhdGFzZXRuYW1lcwpkYXQgPC0gZGF0WyxncmVwKCJUcmFpbiIsbmFtZXMoZGF0KSldCmRhdC5kZiA8LSBwaXZvdF9sb25nZXIoZGF0LDE6bmNvbChkYXQpKQpkYXQuZGYgPC0gcmJpbmQoZGF0LmRmLAogICAgICAgICAgICAgICAgZGF0YS5mcmFtZShuYW1lPSJQcmlvciIsdmFsdWU9cm5vcm0oNTAwMCxtPWxvZyhnbXNjYWxlKSxzZD0wLjQwNTUpKSkKZGF0LmRmJG5hbWUgPC0gZmFjdG9yKGRhdC5kZiRuYW1lLGxldmVscz1yZXYoCiAgICAgICAgICAgICAgICAgICAgICAgIGMoIlByaW9yIixkYXRhc2V0bmFtZXNbZ3JlcCgiVHJhaW4iLGRhdGFzZXRuYW1lcyldKSkpCmRhdC5kZiR2YWx1ZSA8LSBleHAoZGF0LmRmJHZhbHVlKQoKcDwtZ2dwbG90KGRhdC5kZikrCiAgI2dlb21fdmlvbGluKGFlcyh4PW5hbWUseT12YWx1ZSxmaWxsPW5hbWU9PSJQcmlvciIpKSsKICBnZW9tX2JveHBsb3QoYWVzKHg9bmFtZSx5PXZhbHVlLGZpbGw9bmFtZT09IlByaW9yIiksb3V0bGllci5zaGFwZT1OQSkrCiAgc2NhbGVfeV9sb2cxMCgpK2Nvb3JkX2ZsaXAoKSsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWU9TlVMTCwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoIiMwMDk5ODgiLCAiI0VFNzczMyIgKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArICAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBnbXNjYWxlLGNvbG9yPSJncmV5IikrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLHNpemU9MSkpKwogIHlsYWIoIlBvc3RlcmlvciBzaGlmdCBpbiBCYWNrZ3JvdW5kIENvbmNlbnRyYXRpb24iKQoKcHJpbnQocCkKZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLHBhc3RlMCggc2EsIlBGT1NfR01fQ2JnZC5wZGYiKSkgICwgcCwgZHBpPTYwMCkKCmBgYAoKIyMjIEhhbGYtbGlmZQoKRm9yIFBGT1MsIHRoZSBwb3B1bGF0aW9uIEdNIG9mIHRoZSBoYWxmLWxpZmUgaGFzIGEgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiB0aGF0IGlzIG5hcnJvd2VyIHRoYW4gdGhlIHByaW9yLCB3aXRoIGEgcG9zdGVyaW9yIG1lZGlhbiAoOTUlIENJKSBlc3RpbWF0ZSBvZiAzLjA2ICgyLjE2LTQuMzcpIHllYXJzLiBUaGUgcG9wdWxhdGlvbiBHU0QgcG9zdGVyaW9yIGlzIGxhcmdlciB0aGFuIHRoZSBwcmlvciBhdCAxLjQ3KDEuNDQtMS43NSkuCgpgYGB7ciBwb3N0ZXJpb3IgaGlzdG9ncmFtcywgY2FjaGUgPSBUUlVFfQoKCmRhdCA8LSBtdWx0aWNoZWNrJHBhcm1zLnNhbXBbLGMoIk1fbG5fay4xLiIsIlZfbG5fay4xLiIsICJNX2xuX1ZkLjEuIiwgIlNEX2xuX1ZkLjEuIildCm5hbWVzKGRhdCkgPC0gYygiTV9sbl9rKDEpIiwiVl9sbl9rKDEpIiwgIk1fbG5fVmQoMSkiLCAiU0RfbG5fVmQoMSkiKQogIApzZXQuc2VlZCgzLjE0MTU5KQpkYXQkel9sbl9rIDwtIHJub3JtKG5yb3coZGF0KSkKZGF0JHpfbG5fVmQgPC0gcm5vcm0obnJvdyhkYXQpKQpkYXQgJT4lIHJlbmFtZV8oKQpkYXQkbG5fa19pIDwtIGRhdCRgTV9sbl9rKDEpYCArIHNxcnQoZGF0JGBWX2xuX2soMSlgKSpkYXQkel9sbl9rCmRhdCRsbl9WZF9pIDwtIGRhdCRgTV9sbl9WZCgxKWArIGRhdCRgU0RfbG5fVmQoMSlgKmRhdCR6X2xuX1ZkCmxpbm1vZCA8LSBsbShsbl9WZF9pIH4gbG5fa19pLGRhdGE9ZGF0KQpnZ3Bsb3QoZGF0KSArIGdlb21fcG9pbnQoYWVzKGxuX2tfaSxsbl9WZF9pKSkgKyAKICBsYWJzKHN1YnRpdGxlPXBhc3RlKCJBZGogUjIgPSIsc2lnbmlmKHN1bW1hcnkobGlubW9kKSRhZGouci5zcXVhcmVkLDIpKSkKYGBgCgoKIyMgQ2hlY2sgbm9ybWFsaXR5CgpgYGB7ciBub3JtYWxpdHksIGNhY2hlID0gVFJVRX0KCnFxbm9ybShkYXQkbG5fa19pLG1haW49ImxuIGsgUS1RIE5vcm1hbCIpCnFxbGluZShkYXQkbG5fa19pLGNvbD0icmVkIikKcGxvdChlY2RmKGRhdCRsbl9rX2kpKQp4IDwtIHNlcSgtMywxLDAuMDEpCm1fbG5fa19pIDwtICAgbWVhbihkYXQkbG5fa19pKQpzZF9sbl9rX2kgPC0gc2QoZGF0JGxuX2tfaSkKbGluZXMoeCxwbm9ybSh4LG1lYW49bV9sbl9rX2ksc2Q9c2RfbG5fa19pKSxjb2w9InJlZCIpCnRleHQobV9sbl9rX2ktMipzZF9sbl9rX2ksMC45LHBhc3RlKCJtID0iLHNpZ25pZihtX2xuX2tfaSw0KSwiXG5zZCA9IixzaWduaWYoc2RfbG5fa19pLDQpKSkKCnFxbm9ybShkYXQkbG5fVmRfaSxtYWluPSJsbiBWZCBRLVEgTm9ybWFsIikKcXFsaW5lKGRhdCRsbl9WZF9pLGNvbD0icmVkIikKcGxvdChlY2RmKGRhdCRsbl9WZF9pKSkKeCA8LSBzZXEoLTMsMSwwLjAxKQptX2xuX1ZkX2kgPC0gbWVhbihkYXQkbG5fVmRfaSkKc2RfbG5fVmRfaSA8LSBzZChkYXQkbG5fVmRfaSkKCmxpbmVzKHgscG5vcm0oeCxtZWFuPW1fbG5fVmRfaSxzZD1zZF9sbl9WZF9pKSxjb2w9InJlZCIpCnRleHQobV9sbl9WZF9pLTIqc2RfbG5fVmRfaSwwLjkscGFzdGUoIm0gPSIsc2lnbmlmKG1fbG5fVmRfaSw0KSwiXG5zZCA9IixzaWduaWYoc2RfbG5fVmRfaSw0KSkpCgpgYGAKCiMjIENhbGN1bGF0ZSB0YWJsZSB2YWx1ZXMgZm9yIGluZGl2aWR1YWwtbGV2ZWwKYGBge3IgbWFrZS1pbmRpdmlkdWFsLXBhcmFtLW91dCwgY2FjaGUgPSBUUlVFfQpobF9pIDwtIGxvZygyKS8gZXhwKGRhdCRsbl9rX2kpICMgaW5kaXZpZHVhbCBoYWxmLWxpZmUgCm1lZF9obF9pIDwtIHBhc3RlKHNpZ25pZiAobWVkaWFuIChobF9pKSwgMykpICMgbWVkaWFuIG9mIGluZGl2aWR1YWwgaGFsZi1saWZlCmNpX21lZF9obF9pIDwtICAgcGFzdGUoc2lnbmlmIChxdWFudGlsZShobF9pLCBwcm9iPWMoMC4wMjUsMC45NzUpKSwgMyksY29sbGFwc2U9Ii0iKSAjIDk1Y2kgbWVkIGluZGl2aWR1YWwgaGFsZmxpZmUKZ21faGxfaSA8LSBwYXN0ZShzaWduaWYgKGV4cChtZWFuKGxvZyhobF9pKSkpLCAzKSkgIyBnbSAod2hpY2ggc2hvdWxkIGJlIHJlYWxseSBjbG9zZSkKZ3NkX2hsX2kgPC0gcGFzdGUoc2lnbmlmIChleHAoc2QobG9nKGhsX2kpKSksIDMpKSAjIGdzZCBpbmRpdmlkdWFsCgptZWRfVmRfaSA8LSBwYXN0ZShzaWduaWYgKG1lZGlhbihleHAoZGF0JGxuX1ZkX2kpKSwgMykpICMgbWVkaWFuIGluZGl2aWR1YWwgVmQKY2lfbWVkX1ZkX2kgPC1wYXN0ZShzaWduaWYgKHF1YW50aWxlKGV4cChkYXQkbG5fVmRfaSksIHByb2I9YygwLjAyNSwwLjk3NSkpLCAzKSxjb2xsYXBzZT0iLSIpICMgOTVjaSBtZWQgaW5kaXZpZHVhbCBWZApnbV92ZF9pIDwtIHBhc3RlKHNpZ25pZiAoZXhwKG1lYW4oZGF0JGxuX1ZkX2kpKSwgMykpICMgZ20gKHdoaWNoIHNob3VsZCBiZSByZWFsbHkgY2xvc2UpCmdzZF92ZF9pPC0gcGFzdGUoc2lnbmlmIChleHAoc2QoZGF0JGxuX1ZkX2kpKSwgMykpICMgZ3NkIGluZGl2CmBgYAoKCmBgYHtyIGhhbGYtbGlmZSxmaWcuaGVpZ2h0PTIuNSxmaWcud2lkdGg9NCxkcGk9NjAwfQpQRk9TX3ByaW9ycyA8LSBkYXRhLmZyYW1lKAogIGhhbGZsaWZlX0dNPSBsb2coMikvcmxub3JtKDUwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5sb2c9LTEuODk3MSxzZGxvZz0wLjQwNTUpKQpNX2sgPC0gZXhwKGFzLm51bWVyaWMoZGF0JGBNX2xuX2soMSlgKSkKUEZPU19oYWxmbGlmZV9HTSA8LSBsb2coMikvTV9rCgpQRk9TX2hsZ21fcHJfbWVkIDwtIHNpZ25pZihtZWRpYW4oUEZPU19wcmlvcnMkaGFsZmxpZmVfR00sMykpClBGT1NfaGxnbV9wcl9tZWRfOTVjaSA8LXBhc3RlKHNpZ25pZihxdWFudGlsZShQRk9TX3ByaW9ycyRoYWxmbGlmZV9HTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iPWMoMC4wMjUsMC45NzUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlPSItIikKClBGT1NfaGxfbWVkaWFuX2dtIDwtIHNpZ25pZihtZWRpYW4oUEZPU19oYWxmbGlmZV9HTSksMykKUEZPU19obF9tZWRpYW5fZ21fOTVjaSA8LSBwYXN0ZShzaWduaWYocXVhbnRpbGUoUEZPU19oYWxmbGlmZV9HTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iPWMoMC4wMjUsMC45NzUpKSwzKSxjb2xsYXBzZT0iLSIpCgpwPC1nZ3Bsb3QoKSsKICBzdGF0X2RlbnNpdHkoYWVzKGhhbGZsaWZlX0dNLCBjb2xvciA9ICJQcmlvciIpLGRhdGE9UEZPU19wcmlvcnMsZ2VvbT0ibGluZSIsc2l6ZT0yKSsKICBzdGF0X2RlbnNpdHkoYWVzKFBGT1NfaGFsZmxpZmVfR00sc3RhdChkZW5zaXR5KSxjb2xvcj0iUG9zdGVyaW9yIiksZ2VvbT0ibGluZSIsc2l6ZT0xLjUgKSsKICB4bGltKDAsMTUpKwogIGxhYnModGl0bGUgPSBicXVvdGUoIkM6IFBGT1MiflRbMS8yXX4iUG9wdWxhdGlvbiBHTSIpICAsCiAgICAgICBzdWJ0aXRsZT1wYXN0ZSgiUG9zdGVyaW9yIE1lZGlhbiAoOTUlIENJKTogIiwKICAgICAgICAgICAgICAgICAgICAgIFBGT1NfaGxfbWVkaWFuX2dtLCIgKCIsCiAgICAgICAgICAgICAgICAgICAgICBQRk9TX2hsX21lZGlhbl9nbV85NWNpLAogICAgICAgICAgICAgICAgICAgICAgIikiLHNlcD0iIikpKwogIHhsYWIoYnF1b3RlKCJQb3B1bGF0aW9uIEdNIn5UWzEvMl1+Iih5cnMpIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZT1OVUxMLCMKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YyhQcmlvcj0iIzAwOTk4OCIsIFBvc3Rlcmlvcj0iI0VFNzczMyIgKSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyAgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbj1jKDAuOCwwLjcpLAogICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsc2l6ZT0xKSwKICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvcj1OQSkpCnByaW50KHApCmdnc2F2ZShoZXJlICgib3V0cHV0LXBsb3RzIixwYXN0ZTAoIHNhLCJQRk9TX2hsX2dtLnBkZiIpKSwgcCwgZHBpPTYwMCkKIApgYGAKCgoKYGBge3IgUEZPUy1oYWxmLWxpZmUtZ3NkLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLGZpZy5oZWlnaHQ9Mi41LGZpZy53aWR0aD00LGRwaT02MDB9ClBGT1NfcHJpb3JzJGhhbGZsaWZlX0dTRCA9ICBleHAoc3FydChleHAocm5vcm0oNTAwMDAsbT1sb2coMC4yMDAwKSxzZD1sb2coMS4yNzUpKSkpKSAKUEZPU19oYWxmbGlmZV9HU0QgPC0gZXhwKHNxcnQoZGF0JGBWX2xuX2soMSlgKSkKClBGT1NfaGxnc2RfcHJfbWVkIDwtIHNpZ25pZihtZWRpYW4oUEZPU19wcmlvcnMkaGFsZmxpZmVfR1NELDMpKQpQRk9TX2hsZ3NkX3ByX21lZF85NWNpIDwtcGFzdGUoc2lnbmlmKHF1YW50aWxlKFBGT1NfcHJpb3JzJGhhbGZsaWZlX0dTRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iPWMoMC4wMjUsMC45NzUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlPSItIikKUEZPU19obF9nc2RfbWVkIDwtIHNpZ25pZihtZWRpYW4oUEZPU19oYWxmbGlmZV9HU0QpLDMpClBGT1NfaGxfZ3NkX21lZF85NWNpIDwtIHBhc3RlKHNpZ25pZihxdWFudGlsZShQRk9TX2hhbGZsaWZlX0dTRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iPWMoMC4wMjUsMC45NzUpKSwzKSxjb2xsYXBzZT0iLSIpCnA8LWdncGxvdCgpKwogIHN0YXRfZGVuc2l0eShhZXMoaGFsZmxpZmVfR1NELCBjb2xvciA9ICJQcmlvciIpLGRhdGE9UEZPU19wcmlvcnMsZ2VvbT0ibGluZSIsc2l6ZT0yKSsKICBzdGF0X2RlbnNpdHkoYWVzKFBGT1NfaGFsZmxpZmVfR1NELHN0YXQoZGVuc2l0eSksIGNvbG9yID0gIlBvc3RlcmlvciIpLGdlb209ImxpbmUiLHNpemU9MS41KSsKICB4bGltKDEsMykrCiAgbGFicyh0aXRsZSA9IGJxdW90ZSgiRDogUEZPUyJ+VFsxLzJdfiJQb3B1bGF0aW9uIEdTRCIpLCAKICAgICAgIHN1YnRpdGxlPXBhc3RlKCJQb3N0ZXJpb3IgTWVkaWFuICg5NSUgQ0kpOiAiLAogICAgICAgICAgICAgICAgICAgICAgUEZPU19obF9nc2RfbWVkLCIgKCIsCiAgICAgICAgICAgICAgICAgICAgICBQRk9TX2hsX2dzZF9tZWRfOTVjaSwKICAgICAgICAgICAgICAgICAgICAgICIpIixzZXA9IiIpKSsKICB4bGFiKGJxdW90ZSgiUG9wdWxhdGlvbiBHU0QiflRbMS8yXSkpKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lPU5VTEwsIwogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YyhQcmlvcj0iIzAwOTk4OCIsIFBvc3Rlcmlvcj0iI0VFNzczMyIgKSkrIAogICB0aGVtZV9jbGFzc2ljKCkgKyAgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbj1jKDAuOCwwLjcpLAogICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsc2l6ZT0xKSwKICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvcj1OQSkpCnByaW50KHApCmdnc2F2ZShoZXJlICgib3V0cHV0LXBsb3RzIixwYXN0ZTAoIHNhLCAiUEZPU19obF9nc2QucGRmIikpLCBwLCBkcGk9NjAwKQoKYGBgCgoKIyMjIERpc3RyaWJ1dGlvbiBWb2x1bWUKRm9yIFBGT1MsIHRoZSBkYXRhIHdlcmUgbm90IHBhcnRpY3VsYXJseSBpbmZvcm1hdGl2ZSwgYnV0IHNsaWdodGx5IGluY3JlYXNlZCB0aGUgZXN0aW1hdGUgb2YgdGhlIG1lZGlhbiB0byAwLjMwOCgwLjIyMy0wLjU0OCkgc2xpZ2h0bHkuIFRoZXkgd2VyZSBub3QgaW5mb3JtYXRpdmUgYXMgdG8gdGhlIHBvcHVsYXRpb24gR1NELCB3aXRoIHRoZSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9ucyBlc3NlbnRpYWxseSB1bmNoYW5nZWQgZnJvbSB0aGUgcHJpb3JzLgpgYGB7ciBQRk9TLXZkLWdtLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLGZpZy5oZWlnaHQ9Mi41LGZpZy53aWR0aD00LGRwaT02MDB9ClBGT1NfcHJpb3JzJFZkX0dNIDwtIHJsbm9ybSg1MDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFubG9nPS0xLjQ2OTY4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkbG9nPTAuMjYyNCkKUEZPU19WZF9HTSA8LSBleHAoZGF0JGBNX2xuX1ZkKDEpYCkKCiAKClBGT1NfdmRfZ21fcHJfbWVkIDwtIHNpZ25pZihtZWRpYW4oUEZPU19wcmlvcnMkVmRfR00sMykpClBGT1NfdmRfZ21fcHJfbWVkXzk1Y2kgPC0gcGFzdGUoc2lnbmlmKHF1YW50aWxlKFBGT1NfcHJpb3JzJFZkX0dNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2I9YygwLjAyNSwwLjk3NSkpLCAzKSwgY29sbGFwc2U9Ii0iKQpQRk9TX3ZkX2dtX21lZCA8LSBzaWduaWYobWVkaWFuKFBGT1NfVmRfR00pLDMpClBGT1NfdmRfZ21fbWVkXzk1Y2kgPC0gcGFzdGUoc2lnbmlmKHF1YW50aWxlKFBGT1NfVmRfR00sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYj1jKDAuMDI1LDAuOTc1KSksMyksY29sbGFwc2U9Ii0iKQoKcDwtZ2dwbG90KCkrCiAgc3RhdF9kZW5zaXR5KGFlcyhWZF9HTSwgY29sb3IgPSAiUHJpb3IiKSxkYXRhPVBGT1NfcHJpb3JzLGdlb209ImxpbmUiLHNpemU9MikrCiAgc3RhdF9kZW5zaXR5KGFlcyhQRk9TX1ZkX0dNLHN0YXQoZGVuc2l0eSksIGNvbG9yID0gIlBvc3RlcmlvciIpLGdlb209ImxpbmUiLHNpemU9MS41KSsKICB4bGltKDAsMSkrbGFicyh0aXRsZSA9IGJxdW90ZSgiQzogUEZPUyJ+VltkXX4iUG9wdWxhdGlvbiBHTSIpLAogICAgICAgICAgICAgICAgIHN1YnRpdGxlPXBhc3RlKCJQb3N0ZXJpb3IgTWVkaWFuICg5NSUgQ0kpOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1NfdmRfZ21fbWVkLCIgKCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1NfdmRfZ21fbWVkXzk1Y2ksIikiLHNlcD0iIikpKwogICB4bGFiKGJxdW90ZSgiUG9wdWxhdGlvbiBHTSJ+VltkXX4iKGwva2cpIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWU9TlVMTCwjCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoUHJpb3I9IiMwMDk5ODgiLCBQb3N0ZXJpb3I9IiNFRTc3MzMiICkpICsgIHRoZW1lX2NsYXNzaWMoKSArICAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksbGVnZW5kLnBvc2l0aW9uPWMoMC44LDAuNyksCiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIixzaXplPTEpLAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG9yPU5BKSkKcHJpbnQocCkKZ2dzYXZlKGhlcmUgKCJvdXRwdXQtcGxvdHMiLHBhc3RlMCggc2EsICJQRk9TX3ZkX2dtLnBkZiIpKSwgcCwgZHBpPTYwMCkKCmBgYAoKCmBgYHtyIFBGT1MtdmQtc2QsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsZmlnLmhlaWdodD0yLjUsZmlnLndpZHRoPTQsZHBpPTYwMH0KUEZPU19wcmlvcnMkVmRfR1NEID0gZXhwKGFicyhybm9ybSg1MDAwMCxzZD0wLjE3KSkpClBGT1NfVmRfR1NEIDwtIGV4cChkYXQkYFNEX2xuX1ZkKDEpYCkKClBGT1NfdmRfZ3NkX3ByX21lZCA8LSBzaWduaWYobWVkaWFuKFBGT1NfcHJpb3JzJFZkX0dTRCwzKSkKUEZPU192ZF9nc2RfcHJfbWVkXzk1Y2kgPC0gcGFzdGUoc2lnbmlmKHF1YW50aWxlKFBGT1NfcHJpb3JzJFZkX0dTRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iPWMoMC4wMjUsMC45NzUpKSwgMyksIGNvbGxhcHNlPSItIikKClBGT1NfdmRfZ3NkX21lZCA8LSBzaWduaWYobWVkaWFuKFBGT1NfVmRfR1NEKSwzKQpQRk9TX3ZkX2dzZF9tZWRfOTVjaSA8LSBwYXN0ZShzaWduaWYocXVhbnRpbGUoUEZPU19WZF9HU0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYj1jKDAuMDI1LDAuOTc1KSksMyksY29sbGFwc2U9Ii0iKQoKcDwtZ2dwbG90KCkrCiAgc3RhdF9kZW5zaXR5KGFlcyhWZF9HU0QsIGNvbG9yID0gIlByaW9yIiksZGF0YT1QRk9TX3ByaW9ycyxnZW9tPSJsaW5lIixzaXplPTIpKwogIHN0YXRfZGVuc2l0eShhZXMoUEZPU19WZF9HU0Qsc3RhdChkZW5zaXR5KSwgY29sb3IgPSAiUG9zdGVyaW9yIiksZ2VvbT0ibGluZSIsc2l6ZT0xLjUpKwogIHhsaW0oMSwzKSsKICBsYWJzKHRpdGxlID0gYnF1b3RlKCJEOiBQRk9TIn5WW2RdfiJQb3B1bGF0aW9uIEdTRCAiKSwKICAgICAgIHN1YnRpdGxlPXBhc3RlKCJQb3N0ZXJpb3IgTWVkaWFuICg5NSUgQ0kpOiAiLAogICAgICAgICAgICAgICAgICAgICAgUEZPU192ZF9nc2RfbWVkLCIgKCIsCiAgICAgICAgICAgICAgICAgICAgICBQRk9TX3ZkX2dzZF9tZWRfOTVjaSwKICAgICAgICAgICAgICAgICAgICAgICIpIixzZXA9IiIpKSsKIHhsYWIoYnF1b3RlKCJQb3B1bGF0aW9uIEdTRCJ+VltkXSkpKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lPU5VTEwsIAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YyhQcmlvcj0iIzAwOTk4OCIsIFBvc3Rlcmlvcj0iI0VFNzczMyIgKSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyAgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbj1jKDAuOCwwLjcpLAogICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsc2l6ZT0xKSwKICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvcj1OQSkpCnByaW50KHApCmdnc2F2ZShoZXJlICgib3V0cHV0LXBsb3RzIixwYXN0ZTAoIHNhLCAiUEZPU192ZF9nc2QucGRmIikpLCBwLCBkcGk9NjAwKQoKYGBgCgojIyMgQ2xlYXJhbmNlIChqdXN0IHBvcCBHTSkKCkNsIGlzIGsgKiBWZAoKYGBge3IgUEZPUy1jbC1nbSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxmaWcuaGVpZ2h0PTIuNSxmaWcud2lkdGg9NCxkcGk9NjAwfQpQRk9TX3ByaW9ycyRDTF9HTSA8LSBQRk9TX3ByaW9ycyRWZF9HTSAqIChsb2coMikvUEZPU19wcmlvcnMkaGFsZmxpZmVfR00pClBGT1NfQ0xfR00gPC0gZXhwKGRhdCRgTV9sbl9WZCgxKWAgKyBkYXQkYE1fbG5faygxKWApCgpQRk9TX2NsX2dtX3ByX21lZCA8LSBzaWduaWYobWVkaWFuKFBGT1NfcHJpb3JzJENMX0dNLDMpKQpQRk9TX2NsX2dtX3ByX21lZF85NWNpIDwtIHBhc3RlKHNpZ25pZihxdWFudGlsZShQRk9TX3ByaW9ycyRDTF9HTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iPWMoMC4wMjUsMC45NzUpKSwgMyksIGNvbGxhcHNlPSItIikKUEZPU19jbF9nbV9tZWQgPC0gc2lnbmlmKG1lZGlhbihQRk9TX0NMX0dNKSwzKQpQRk9TX2NsX2dtX21lZF85NWNpIDwtIHBhc3RlKHNpZ25pZihxdWFudGlsZShQRk9TX0NMX0dNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2I9YygwLjAyNSwwLjk3NSkpLDMpLGNvbGxhcHNlPSItIikKCnA8LWdncGxvdCgpKwogIHN0YXRfZGVuc2l0eShhZXMoQ0xfR00sIGNvbG9yID0gIlByaW9yIiksZGF0YT1QRk9TX3ByaW9ycyxnZW9tPSJsaW5lIixzaXplPTIpKwogIHN0YXRfZGVuc2l0eShhZXMoUEZPU19DTF9HTSxzdGF0KGRlbnNpdHkpLCBjb2xvciA9ICJQb3N0ZXJpb3IiKSxnZW9tPSJsaW5lIixzaXplPTEuNSkrCiAgeGxpbSgwLDAuMjUpK2xhYnModGl0bGUgPSAiQjogUEZPUyBDbGVhcmFuY2UgUG9wLiBHTSAiLHN1YnRpdGxlPXBhc3RlKCJQb3N0ZXJpb3IgTWVkaWFuICg5NSUgQ0kpOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1NfY2xfZ21fbWVkLCIgKCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZPU19jbF9nbV9tZWRfOTVjaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIsc2VwPSIiKSkrCiAgeGxhYigiUG9wLiBHTSBDTCAobC8oa2cteXIpKSIpKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lPU5VTEwsIwogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKFByaW9yPSIjMDA5OTg4IiwgUG9zdGVyaW9yPSIjRUU3NzMzIiApKSArICAKICB0aGVtZV9jbGFzc2ljKCkgKyAgCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLGxlZ2VuZC5wb3NpdGlvbj1jKDAuOCwwLjcpLAogICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsc2l6ZT0xKSwKICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvcj1OQSkpCnByaW50KHApCmdnc2F2ZShoZXJlICgib3V0cHV0LXBsb3RzIixwYXN0ZTAoIHNhLCAiUEZPU19DTF9nbS5wZGYiKSksIHAsIGRwaT02MDApCgpgYGAKCiMjIFRhYmxlIHNpZ25pZmljYW50IGRpZ2l0IHZhbHVlcwoKYGBge3IgdGFibGUtdmFycyB9ClBGT1NfaGxnbV9wcl9tZWQgPC0gcGFzdGUoc2lnbmlmKFBGT1NfaGxnbV9wcl9tZWQsIDMpKQpQRk9TX2hsX21lZGlhbl9nbTwtIHBhc3RlKHNpZ25pZihQRk9TX2hsX21lZGlhbl9nbSwgMykpClBGT1NfaGxnc2RfcHJfbWVkPC0gcGFzdGUoc2lnbmlmKFBGT1NfaGxnc2RfcHJfbWVkLCAzKSkKUEZPU19obF9nc2RfbWVkPC0gcGFzdGUoc2lnbmlmKFBGT1NfaGxfZ3NkX21lZCwgMykpClBGT1NfdmRfZ21fcHJfbWVkPC0gcGFzdGUoc2lnbmlmKFBGT1NfdmRfZ21fcHJfbWVkLCAzKSkKUEZPU192ZF9nbV9tZWQ8LSBwYXN0ZShzaWduaWYoUEZPU192ZF9nbV9tZWQsIDMpKQpQRk9TX3ZkX2dzZF9wcl9tZWQ8LSBwYXN0ZShzaWduaWYoUEZPU192ZF9nc2RfcHJfbWVkLCAzKSkKUEZPU192ZF9nc2RfbWVkPC0gcGFzdGUoc2lnbmlmKFBGT1NfdmRfZ3NkX21lZCwgMykpClBGT1NfY2xfZ21fcHJfbWVkPC0gcGFzdGUoc2lnbmlmKFBGT1NfY2xfZ21fcHJfbWVkLCAzKSkKUEZPU19jbF9nbV9tZWQ8LSBwYXN0ZShzaWduaWYoUEZPU19jbF9nbV9tZWQsIDMpKQpgYGAKCiMjIyBQb3B1bGF0aW9uIG1lZGlhbiBlc3RpbWF0ZXMgWzk1JSBDSV0gCgp8IFBhcmFtZXRlciAgICAgICAgICAgICAgICAgICAgICB8IFByaW9yIEdNICAgICAgfCBQb3N0ZXJpb3IgR00gfCBQcmlvciAgR1NEICAgIHwgUG9zdGVyaW9yIEdTRCB8IAp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLTp8IAp8IEhhbGYtbGlmZSAoeWVhcnMpICB8IGByIHBhc3RlKFBGT1NfaGxnbV9wcl9tZWQpIGAgfCAgIGByIHBhc3RlKFBGT1NfaGxfbWVkaWFuX2dtKSBgICAgIHwgYHIgIHBhc3RlKFBGT1NfaGxnc2RfcHJfbWVkKSBgICAgICAgICAgICB8IGByIHBhc3RlKFBGT1NfaGxfZ3NkX21lZClgICB8IAp8IEhMICBbOTUlIENJXSAgfGByIHBhc3RlMCgiWyIsUEZPU19obGdtX3ByX21lZF85NWNpLCJdIilgIHwgYHIgcGFzdGUwKCAiWyIsUEZPU19obF9tZWRpYW5fZ21fOTVjaSwiXSIpYHwgYHIgcGFzdGUwKCJbIixQRk9TX2hsZ3NkX3ByX21lZF85NWNpLCJdIilgfCBgciBwYXN0ZTAoICJbIixQRk9TX2hsX2dzZF9tZWRfOTVjaSwgIl0iKWB8CnwgVm9sdW1lIG9mIGRpc3RyaWJ1dGlvbiAgICB8IGByIHBhc3RlKFBGT1NfdmRfZ21fcHJfbWVkKSBgIHwgICAgYHIgcGFzdGUoICBQRk9TX3ZkX2dtX21lZCkgYHwgICBgciAgcGFzdGUoUEZPU192ZF9nc2RfcHJfbWVkKWAgIHxgciAgcGFzdGUoUEZPU192ZF9nc2RfbWVkKWAgfCAgCnwgJFZfRCQgWzk1JSBDSV0gICAgfGByIHBhc3RlMCggIlsiLFBGT1NfdmRfZ21fcHJfbWVkXzk1Y2ksIl0iKWB8IGByIHBhc3RlMCggIlsiLFBGT1NfdmRfZ21fbWVkXzk1Y2ksIl0iKWB8IGByIHBhc3RlMCgiWyIsUEZPU192ZF9nc2RfcHJfbWVkXzk1Y2ksICJdIilgfCBgciBwYXN0ZTAoICAiWyIsUEZPU192ZF9nc2RfbWVkXzk1Y2ksICJdIilgfCAKfCBDbGVhcmFuY2UgICAgfCBgciBwYXN0ZShQRk9TX2NsX2dtX3ByX21lZCkgYCB8ICAgIGByIHBhc3RlKCAgUEZPU19jbF9nbV9tZWQpIGB8ICAgYHIgIHBhc3RlKClgICB8YHIgIHBhc3RlKClgIHwgIAp8ICRDTCQgWzk1JSBDSV0gICAgfGByIHBhc3RlMCggIlsiLFBGT1NfY2xfZ21fcHJfbWVkXzk1Y2ksIl0iKWB8IGByIHBhc3RlMCggIlsiLFBGT1NfY2xfZ21fbWVkXzk1Y2ksIl0iKWB8IGByIHBhc3RlMCgiWyIsICJdIilgfCBgciBwYXN0ZTAoICAiWyIsICJdIilgfCAKIAoKCgojIyMgSW5kaXZpZHVhbCBQb3N0ZXJpb3IgZXN0aW1hdGVzIAoKfCBQYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICAgfCAgbWVkaWFuIEdNICBbOTUlIENJXSB8IEdNIGNhbGN1bGF0b3IgaW5wdXQgIHwgIEdTRCBpbmRpdmlkdWFsIHwKfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tOnwgCnwgSGFsZi1saWZlICh5ZWFycykgICAgICAgICAgICAgIHwgYHIgIHBhc3RlKG1lZF9obF9pLCAiWyIsY2lfbWVkX2hsX2ksIl0iKSBgIHwgYHIgIHBhc3RlKGdtX2hsX2kpIGAgfCBgciAgcGFzdGUoZ3NkX2hsX2kpYHwKfCBWb2x1bWUgb2YgZGlzdHJpYnV0aW9uICRWX0QkICAgfCBgciAgcGFzdGUobWVkX1ZkX2ksICJbIixjaV9tZWRfVmRfaSwiXSIpIGB8ICBgciAgcGFzdGUoZ21fdmRfaSkgYCB8IGByICBwYXN0ZShnc2RfdmRfaSkgYHwgCgoKYGBge3IgZWNobz1GQUxTRX0KZGV2dG9vbHM6OnNlc3Npb25faW5mbygpCmBgYA==